题目描述:牛牛得到一个长度为n的整数序列V,牛牛定义一段连续子序列的幸运值为这段子序列中最大值和次大值的异或值(次大值是严格的次大)。牛牛现在需要求出序列V的所有连续子序列中幸运值最大是多少。
输入描述:
第一行一个整数n,即序列的长度。(2<= n <= 100000)
第二行n个数,依次表示这个序列每个数值V[i], (1 ≤ V[i] ≤ 10^8)且保证V[1]到V[n]中至少存在不同的两个值.
输出:
输出一个整数,即最大的幸运值。
例:输入:
5
5 2 1 4 3
输出:7
代码实现
import java.util.Scanner;
import java.util.Collections;
import java.util.ArrayList;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] arr = new int[n];
for(int i = 0;i<n;i++){
arr[i] = in.nextInt();
}
//思路
//1.定义集合存储各异或的值
//2.遍历数组:将每个数都看作次大值
//3.向右搜索:将当前次大值与右边第一个比它大的值异或并加入集合
//4.向左搜索:将当前次大值与左边第一个比它大的值异或并加入集合
//5.集合升序排序:返回集合最大值
ArrayList<Integer> list = new ArrayList<>();
for(int i= 0;i<arr.length-1;i++){
for(int j = i+1;j<arr.length;j++){
if(arr[i]<arr[j]){
list.add(arr[i]^arr[j]);
break;
}
}
}
for(int i= arr.length-1;i>0;i--){
for(int j = i-1;j>=0;j--){
if(arr[i]<arr[j]){
list.add(arr[i]^arr[j]);
break;
}
}
}
Collections.sort(list);
System.out.println(list.get(list.size()-1));
}
}
或者将左搜索和右搜索合并在一块,运行内存会小一点。
for(int i = 0;i<arr.length;i++){
//左搜索
for(int m = i-1;m>=0;m--){//i从1开始,因为arr[0]无左搜索
if(arr[i]<arr[m]){
list.add(arr[i]^arr[m]);
break;
}
}
//右搜索
for(int f = i+1;f<arr.length;f++){//此处当次大值为arr[len-1]时只有左搜索
if(arr[i]<arr[f]){
list.add(arr[i]^arr[f]);
break;
}
}
}