使用数组解决Java任务

时间:2016-05-31 21:45:36

标签: java arrays

我正在尝试编写与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");
            }
        }
    }
}

代码进入无限循环,如果有任何错误,请纠正我。

3 个答案:

答案 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