#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.
}
}