搜狗第三题吃糖代码
暴力解天下无敌
虽然我只做了这一个
前两个题看着就怕
。。
思路:
小明和小红都想要赢,所以他们每次都会选当下最多的糖盒,一开始的时候小明会选全局最大的,然后就有了断点,以后就从每一次的断点的两边取糖盒,所以比较的就是左和右的大小,每一次取走糖盒,就把环重新排成新的环,然后再进行此过程,直到没有糖盒。
最后比较小明和小红拿的糖的大小,计算差值,就好啦
package test; import java.util.Scanner; public class Sougou{ public static int solution(int [] array){ int xiaoming=0; int xiaohong=0; int cutIndex=max(array); //定义切点,首先取第一个切点(小明先拿)。 xiaoming=xiaoming+array[cutIndex]; array[cutIndex]=0; //先选掉最大的那盒,变成环状。 array=transform(array); //transform方法是每次拿走一个糖盒之后,把数组重新排成新的数组。可以理解为形成新的环。 int num=array.length; for(int i=0,j=1;i<num;i++,j++){ //num是一共还有多少个糖盒,就循环取多少次 int maxIndex;//最大值的下标 if(cutIndex==array.length) { //最大值下标如果是新数组长度,例如新数组长度是4,下标有0123,maxIndex是4,说明上一次取走的糖盒是4,这种情况的左和右是array.length-1和0; maxIndex=maxLeftOrRight(array,array.length-1,0); }else if(cutIndex==0){ //最大值下标如果是0,那么说明上次取走的是数组第一个,那么数组重新组合后,曾经在1位置的数左移到了0位置,那左和右分别是array.length-1(数组最后一个数)和cutIndex=0; maxIndex=maxLeftOrRight(array,array.length-1,cutIndex); }else if(cutIndex==array.length-1){ //最大值下标如果是最后一个数,说明上一次取走的是数组倒数第二个数,那左和右就分别为cutIndex-1和cutIndex。 maxIndex=maxLeftOrRight(array,cutIndex-1,cutIndex); }else{ //其他情况,表示的就是在中间那些被取走的糖盒,他们不属于特殊情况,只需要取左AND右就行。 maxIndex=maxLeftOrRight(array,cutIndex-1,cutIndex); } if(j%2==1){ //定义一个J值,从1开始,因为小明和小红循环取糖盒,所以循环每人加数字。 xiaohong=xiaohong+array[maxIndex]; array[maxIndex]=0; cutIndex=maxIndex; array=transform(array); }else if(j%2==0){ xiaoming=xiaoming+array[maxIndex]; array[maxIndex]=0; cutIndex=maxIndex; array=transform(array); } } int result=xiaoming>xiaohong?xiaoming-xiaohong:xiaohong-xiaoming; return result; } public static int [] transform(int [] array){ //每次取值后,因为被取走的位置是0,所以应该把数组转换为新的环,去掉0值,就是这个过程。 int [] temp=new int [array.length]; for(int i=0,j=0;i<array.length;i++){ if(array[i]!=0){ temp[j]=array[i]; j++; } } int count=0; for(int i=0;i<temp.length;i++){ if(temp[i]!=0){ count++; } } int [] newArray=new int [count]; for(int i=0;i<count;i++){ newArray[i]=temp[i]; } return newArray; } public static int max(int [] array){ //由于小明和小红都想赢,所以在最开始小明肯定选最大的,这个Max是选最大的过程。 int index=0; for(int i=0;i<array.length;i++){ index=array[i]>array[index]?i:index; } return index; } public static int maxLeftOrRight(int [] array ,int left,int right){ //在左和右中选最大的过程 return array[left]>array[right]?left:right; } public static void main(String[] args){ Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int [] array= new int [n]; for(int i=0;i<array.length;i++){ array[i]=sc.nextInt(); } int result=solution(array); System.out.println(result); } }
#搜狗##笔试题目#