解题思路:

输入所需数据,分别用两组数组存储数列和检查值。

check方法的逻辑是:创建一个HashSet对象set,遍历数组a的指定范围[l, r],对于每个元素a[i],检查set中是否已经存在一个元素与a[i]异或后等于x。如果存在,则返回true;否则,将a[i]添加到set中。如果遍历完整个范围都没有找到满足条件的元素对,则返回false。


注意事项:

例:a^a=0,b^0=b;
在遍历到元素a[i]时,计算x与a[i]的异或结果,然后检查这个结果是否已经在HashSet中。如果存在,说明之前有一个元素a[j](其中j < i)满足a[j] ^ a[i] = x,因此返回true。否则,将a[i]添加到HashSet中,继续遍历。

a[j]^a[i]=x——>x^a[i]=a[j]^a[i]^a[i]=a[j]

参考代码:
import java.util.HashSet;
import java.util.Scanner;
public class caiYao {
       public static void main(String[] args) {
              Scanner sc=new Scanner(System.in);
              int n=sc.nextInt();
              int m=sc.nextInt();
              int x=sc.nextInt();
              int[] a=new int[n];
              String[] b=new String[m];//用来存储检查后的值
              for (int i = 0; i <a.length ; i++) {
                       a[i]=sc.nextInt();
               }
               for (int i = 0; i < m; i++) {
                       int l=sc.nextInt()-1;//减一代表数组序号
                       int r=sc.nextInt()-1;
                       b[i]=(check(a,l,r,x)?"yes":"no");//将布尔值切换为所需值
               }
               sc.close();
               for (String i:b) {
                       System.out.println(i);
               }
       }
           public static boolean check(int[] a,int l,int r,int x){
                   HashSet<Integer> set=new HashSet<>();//使用HashSet来减少时间复杂度

                       for (int i = l; i <= r; i++) {
                           if (set.contains(a[i]^x)){       //set.contain(H) 检查set中是否含H
                                   return true;
                           }
                            set.add(a[i]);
                     }
                       return false;
               }

//下面是未优化的方法

/*

public static boolean check(int[] a, int l, int r, int x) {  

          for (int i = l; i <= r; i++) {      

              for (int j = i + 1; j <= r; j++) {           

                     if ((a[i] ^ a[j]) == x) {            

                        return true;     }     

               }     

           } return false;  

          }

*/

}

点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 2 条评论

yxy 4月前 回复TA
%% orz
109徐守佳 4月前 回复TA
%%%(膜(%)拜)