我正在尝试编写与Java中的数组相关的问题的解决方案。问题是这样的:
您将获得一个长度 n 的数组,索引范围为0到 n - 1.数组的每个元素都是0或1.您只能移动到包含0的索引。首先,您处于0 th 位置。在每次移动中,您都可以执行以下操作之一:
- 向前或向后走一步。
- 向前跳转 m 。
这意味着您可以从位置 x 移动到 x + 1, x - 1或 x + m 一举一动。新位置必须包含0.此外,您可以移动到大于n-1的任何位置。
你无法从位置0向后移动。如果你移动到任何大于n - 1的位置,你就赢了游戏。
考虑到阵列和跳跃的长度,你需要确定它是否有可能赢得比赛。
以下是示例测试用例:
6 5 0 0 0 1 1 1 YES 6 3 0 0 1 1 1 0 NO
我的代码:
import java.io.*;
import java.util.*;
public class hcrkarryjump {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int a[]=new int[n];
for(int k=0;k<n;k++)
a[k]=sc.nextInt();
int i=0;
while(i<n){
if(a[i]==0)
i++;
if(a[i]==1){
if(a[i+1]==0 &&(i+m>=n-1))
System.out.println("YES");
else
System.out.println("NO");
}
}
}
}
代码进入无限循环,如果有任何错误,请纠正我。
答案 0 :(得分:2)
如果您遇到[i]!= 0(因此它是1)的情况,您将完成迭代,但是您不会向变量i添加内容。
所以例如:
Take 1 step i => 1
Land on 0, ok i => 2
Land on 1, print yes or no, i=> 2
Land on the same 1, print ... , i => 2
因此,条件虽然(i
答案 1 :(得分:2)
你得到一个无限循环,因为一旦你到[i] == 1,你永远不会增加。
为避免无限循环,您的代码应为:
import java.io.*;
import java.util.*;
public class hcrkarryjump {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int a[]=new int[n];
for(int k=0;k<n;k++)
a[k]=sc.nextInt();
int i=0;
while(i<n){
// Check if we have something to do
if(a[i]==1){
// We do stuff
if(a[i+1]==0 &&(i+m>=n-1))
System.out.println("YES");
else
System.out.println("NO");
}
// and increment for the while check and next loop
i++;
}
}
}
答案 2 :(得分:1)
正如其他人所说,你永远不会class ParticipantsController < ApiController
before_action :require_login, :only => [:create_participant, :update_participant]
# Creates a participation of a person in the event
# Receives the following params:
# - +event_id+
# - +in_team+::_boolean
# - +event_role+
def create_participant
# … some logic
if participant.save
render :status => :ok, :json => Hash[
:participant_id => participant.id,
:team_participant_id => participant.team_participant_id
]
else
render :status => 406, :json => Hash[
:message => t('alerts.error_saving'),
:errors => participant.errors.as_json
]
end
end
end
一次增加i
。它只会坐在那里旋转相同的位置(a[i] == 1
值)。
但是,您的算法存在缺陷。考虑这种情况:
i
您不会检查所有3个选项(向后1,向前1,向前X)。
你也不会检查你是否已经去过某个地方。如果你没有检查你是否在某个地方,你的代码可能会循环:前进1,后退1,前进1,后退1,前进1,后退1,前进1,后退1,等等... < / em>的
现在考虑一下:
8 3
0 1 0 0 1 0 1 1
↑ start position
↑ forward 3 (couldn't forward 1 or backward 1)
↑ backward 1 (couldn't forward 1 or 3)
↑ forward 3 (couldn't backward 1 and already been to forward 1)
↑ forward 3 (couldn't forward 1 or backward 1) WIN !!!
如您所见,您可能需要回溯才能找到正确的路径。无论您先尝试3个选项中的哪一个(向后1,向前1,向前X),都是如此。
像这样的回溯逻辑通常使用递归方法实现,但也可以通过手动维护堆栈来完成。最后,您应该只在完成搜索后打印16 5
0 0 0 1 1 0 1 0 1 0 0 1 0 1 1 1
↑ start position
↑ forward 5
↑ forward 5
↑ backward 1 DEAD END !!! (or loop if not checking "been there")
↑ backtrack to here
↑ forward 1
↑ forward 1
↑ forward 5
↑ forward 5
↑ forward 5 WIN !!!
或YES
,即如果您到达目的地,打印NO
并停止搜索,或者如果您已经尝试了所有组合而没有达到目的,打印YES
。