关于给出1..n个数,其中缺少2个元素,找到那2个缺失的元素

我的想法是这个数组先异或一遍,在和1~n异或一遍,结果放到变量xor里,然后创建两个循环,如果xor^i^j为零,那么i和j就是缺少的数字,但是却不行,这是为什么

package yuangong;

public class FindTwoOfNNumbers {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        int[] digit={
                1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,17,
                18,19,20,31,32,33,34,35,36,37,38,39,40,
                51,52,53,54,55,56,57,58,59,60,21,22,23,
                24,25,26,27,28,29,30,41,42,43,44,45,46,
                47,48,49,50,61,62,63,64,65,66,67,68,69,
                70,71,72,73,74,75,76,77,78,79,80,81,82,
                83,84,85,86,87,88,89};//1~90缺少11,90
        
        int n=digit.length;
        int xor=0;
        
        for(int i=0;i<n;i++){
            xor=xor^digit[i]^(i+1);
        }
        xor=xor^(n+1)^(n+2);
        int XOR;
        for(int i=1;i<=n+2;i++){        
            for(int j=1;j<=n+2;j++){
                XOR=xor^i^j;
                if((XOR)==0){
                    System.out.println(i+" "+j);
                    break;
                }    
            }
        }
    }
}

  public static void main(String[] args) {
    // TODO 自动生成的方法存根
    int[] digit={
        1,2,3,4,5,6,7,8,9,10,
        13,14,15,16,17,18,19,20,
        21,22,23,24,25,26,27};//1~90缺少11,90

    int num = 0;
    for (int i = 0; i < 30; i ++) {
      // num >= digit.length 是因为如果缺少像 30 这种的话,就会有问题
      // num 的作用就是 digit 的偏移,因为要保证 i + 1 和 digit[num] 对得上
      if (num >= digit.length || digit[num] != i + 1) {
        System.out.println((i + 1));
      } else {
        num ++;
      }
    }
  }

 

说错了,没有看懂题目,但是为什么不行是因为如果一个数只重复了两次,那么它就被消掉了,你就会以为它本来就没有

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632