我正在编写一个程序来查找给定数组中唯一出现一次的数字,例如 {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.
    }
}