我的思路:一个数组中元素进行或运算,要求值最大且长度最短,如果刨除最大值,其他值做或运算无论如何也不可能比最大值大,所以先找出数组中最大值,然后分别向两边遍历,
1、如果与相邻的值进行或运算比原值大,则 长度count加一
2、如果或运算等于原值就要继续遍历查看接下来是否还会变大,并记录或运算相等的值的数量,如果还能继续比原值大,则将这些元素加进去
3、如果相邻元素进行或运算比原值小,则直接终止该方向的遍历。
答题的时候题没看清楚,只过了20%,稍微修改了的代码:
import java.util.Scanner; public class Shell3 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); long count = 1; int n = sc.nextInt(); int[] arr = new int[n]; int max = 0; int index = 0; for(int i = 0;i < n;i++){ arr[i] = sc.nextInt(); if(max < arr[i]){ max = arr[i]; index = i; } } int left = 0; int right = 0; for(int i = index;i>0;i--){ int min = arr[i-1]; if((max | min) > max){ max |= min; count = count+left+1; left = 0; }else if((max |= min) == max){ left += 1; continue; }else{ break; } } for(int i = index;i < n-1;i++){ int min = arr[i+1]; if((max | min) > max){ max |= min; count = count+right+1; right = 0; }else if((max |= min) == max){ right += 1; continue; }else{ break; } } System.out.println(count); } }
全部评论
(3) 回帖