Я пишу программу, чтобы найти единственное число, появляющееся один раз в заданном массиве, например {1,2,2},{1,2,1,2,4},{1,0,1} использование вложенного цикла for в java

#java #arrays #nested-loops

Вопрос:

в первом цикле я присваиваю каждый элемент внутри цикла tmp , а во втором цикле я сравниваю tmp со всеми элементами(включаю себя) в массив, если tmp == элемент, затем добавляю количество(количество записей времени).После внутреннего цикла, если count==1(равен только самому себе) , затем выпрыгните из цикла out и верните tmp.

Я не могу найти логические проблемы,пожалуйста, помогите мне найти проблему в моей логике или коде , было передано несколько случаев, кроме {1,0,1}, которые выводят 1 вместо 0

 /**
 *
 * @author Ryan
 */
public class SingleNum {


 public static int singleNumber(int[] nums) {
        int count=0,tmp=0;

        for(int j = 0;j < nums.length;j  )
        {
            tmp = nums[j];
            for(int i = 0;i < nums.length;i  )
            {
            if(tmp == nums[i])
            count =1;   
            }
            if(count == 1)
            break;              
        }
        return tmp;
    }
    /**
     * @param args the command line arguments
     */
    class Solution {
   
}
    public static void main(String[] args) {
        int array [] = {1,0,1};
        System.out.println(singleNumber(array));
    }
    
}
 

Ответ №1:

В первую очередь старайтесь избегать вложенных циклов for, потому что они тратят время на поиск оптимальных решений.

  • Вы сравнивали одно и то же число с самим собой, но оно было сбалансировано значением счетчика как 1 для одного числа вхождения, и вы не сбрасывали значение счетчика до нуля после завершения вложенного цикла for.
      /**
     *
     * @author Ryan
     */
    public class SingleNum {
    
    
    public static int singleNumber(int[] nums) {
     int count=0,tmp=0;
    
     for(int j = 0;j < nums.length;j  )
     {
         tmp = nums[j];
         count = 0;
         for(int i = 0;i < nums.length;i  )
         {
         if(i != j amp;amp; tmp == nums[i])
         count =1;   
         }
         if(count == 0)
         break;              
     }
     return tmp;
     }
     /**
      * @param args The command-line arguments
      */
     class Solution {
     public static void main(String[] args) {
         int array [] = {1,0,1};
         System.out.println(singleNumber(array));
     }
     }
     

Комментарии:

1. спасибо,Ашиш,это работает. И я =! j должен быть я !=j

2. Вы говорите оператору не использовать вложенные циклы , но вы добавляете неэффективность, сравнивая i to j , поэтому теперь для длины массива n вы выполняете 2*n-1 сравнения вместо n сравнений. Просто полностью исключите первое сравнение и найдите число = 1.

3. @WJS вы правы, сравнение снизило бы эффективность, добавило бы правильное решение.

Ответ №2:

Единственное, что вы сделали неправильно, — это не сбросили счетчик до 0. Тем не менее, я добавил еще несколько оптимизаций.

  • как только количество превысит 1, остановите внутренний цикл и продолжите внешний
  • если внутренний цикл продолжается успешно, вы знаете, что количество было только 1, поэтому вы можете немедленно вернуть tmp.
  • если вы полностью завершите внешний цикл, это означает, что значения не появлялись только один раз, поэтому верните -1. Это означает, что -1 не должно быть законным значением. Если это так, следует использовать какой-то другой способ показать это.
  • наконец, если один раз встречается более одного значения, будет возвращено только первое.
 public class SingleNum {
    public static void main(String[] args) {
        int array[] = { 3,3, 2, 2, 4, 5,5 };
        System.out.println(singleNumber(array)); // prints 4
    }
    
    public static int singleNumber(int[] nums) {
        int tmp = 0;
        outer: for (int num : nums) {
            int count = 0;
            tmp = num;
            for (int val : nums) {
                if (tmp == val) {
                    count  ;
                    // as soon as count > 1, stop this inner loop
                    if (count > 1) {
                        continue outer;
                    }
                }
            }
            return tmp;
        }
        return -1; // -1 shows no single values.
    }
}