我正在编写一个程序来查找给定数组中唯一出现一次的数字,例如 {1,2,2},{1,2,1,2,4},{1,0,1} 在 java
I am writing a program to find the only appear once number in an given array like {1,2,2},{1,2,1,2,4},{1,0,1} using nested for loop in java
在第一个循环中,我将循环内的每个元素分配给 tmp ,在第二个循环中,我将 tmp 与数组中的所有元素(包括自身)进行比较,如果 tmp == 元素,则添加count(Record num of time).inside循环后,如果count==1(只等于自身),则跳出out循环,return 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));
}
}
最重要的是尽量避免嵌套 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 && 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));
}
}
您做错的唯一一件事就是没有将计数重置为 0。但是,
我添加了更多优化。
- 一旦计数超过 1,停止内循环并继续外循环
- 如果内循环成功继续,你知道计数只有 1 所以
你可以立即 return tmp.
- 如果你完全完成外循环,这意味着没有值只出现一次,所以 return -1。这意味着 -1 不应是合法值。如果是,则应使用其他一些方法来显示它。
- 最后,如果不止一个值出现一次,只有第一个会被 returned。
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.
}
}
在第一个循环中,我将循环内的每个元素分配给 tmp ,在第二个循环中,我将 tmp 与数组中的所有元素(包括自身)进行比较,如果 tmp == 元素,则添加count(Record num of time).inside循环后,如果count==1(只等于自身),则跳出out循环,return 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));
}
}
最重要的是尽量避免嵌套 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 && 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)); } }
您做错的唯一一件事就是没有将计数重置为 0。但是, 我添加了更多优化。
- 一旦计数超过 1,停止内循环并继续外循环
- 如果内循环成功继续,你知道计数只有 1 所以 你可以立即 return tmp.
- 如果你完全完成外循环,这意味着没有值只出现一次,所以 return -1。这意味着 -1 不应是合法值。如果是,则应使用其他一些方法来显示它。
- 最后,如果不止一个值出现一次,只有第一个会被 returned。
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.
}
}