问题描述
谁有简单的法子做这个题,尽量不要再新建另外的数组当初面试老师喊我不要用另外的数组这样:publicstaticvoidmain(String[]args){int[]n=newint[]{42,21,2,31};int[]x=newint[n.length];System.out.println("输入移动多少位:");Scanners=newScanner(System.in);intm=s.nextInt();for(inti=0;i<n.length;i++)x[i]=n[i];for(inti=0;i<n.length;i++){inttp=(i+m)%n.length;n[tp]=x[i];}System.out.println(Arrays.toString(n));}
解决方案
解决方案二:
怎么没人啊,自己顶一个
解决方案三:
有人帮帮忙么,
解决方案四:
for(inti=0;i<m;i++){temp(a[i],a[i+m]);}
解决方案五:
1、先用unshift()方法分辨将最后m个数依次插入数组前面2、将最后面多出的m个数给截了
解决方案六:
int[]n=newint[]{42,21,2,31};System.out.println("输入移动多少位:");Scanners=newScanner(System.in);intm=s.nextInt();while(true){if(m>n.length-1||m<0){System.out.println("移动位数不能大于等于数组个数,且不能移动负位!请重新输入");m=s.nextInt();}else{break;}}Stringstr="";for(inti=0;i<m;i++){str+=n[n.length-m+i]+",";//截取m到n.length之间字符}for(inti=0;i<n.length-m-1;i++){//截取0到m间字符str+=n[i]+",";}str+=n[n.length-m-1];Stringsz[]=str.split(",");//组装后的字符再根据逗号拆分for(inti=0;i<n.length;i++){//分别将String转换intn[i]=Integer.parseInt(sz[i]);}System.out.println(Arrays.toString(n));
解决方案七:
我上面那个方法有点取巧而已,因为不让新建数组那只能绕远路,我们"新建"字符串没说不让吧?
解决方案八:
publicclassTest{publicstaticvoidmain(String[]args){int[]arr={1,2,3,4,5,6,7};intlen=arr.length;intbits=5;for(inti=0,temp;i<bits;i++){temp=arr[0];for(intj=1;j<len;j++){arr[j-1]=arr[j];}arr[len-1]=temp;}for(inti=0;i<len;i++){System.out.print(arr[i]);System.out.print('t');}}}
解决方案九:
利用一下最大公约数,找出最大周期,然后依次移动就好了这个算法复杂度应该是O(n),当n和m都比较大的时候,目测比楼上的O(nm)还是好很多的publicstaticvoidmain(String[]args){intshift=3;int[]arr;arr=newint[]{1,2,3,4,5,6,7,8,9,10,11,12};shiftLeft(arr,shift);System.out.printf("向左移动%d%s%n",shift,Arrays.toString(arr));arr=newint[]{1,2,3,4,5,6,7,8,9,10,11,12};shiftRight(arr,shift);System.out.printf("向右移动%d%s%n",shift,Arrays.toString(arr));}/***向右移动*要求arr!=null&&arr.length>=1&&shift>=0*/publicstaticvoidshiftRight(int[]arr,intshift){if((shift%=arr.length)==0){return;}intlen=arr.length;intstep=GCD(len,shift);intround=len/step;for(inti=0;i<step;i++){intt=arr[(i+shift*round)%len],index1=0,index2=0;for(intj=round;j>1;j--){index2=(i+shift*j-shift)%len;index1=(index2+shift)%len;arr[index1]=arr[index2];}arr[index2]=t;}}/***向左移动*要求arr!=null&&arr.length>=1&&shift>=0*/publicstaticvoidshiftLeft(int[]arr,intshift){if((shift%=arr.length)==0){return;}intlen=arr.length;intstep=GCD(len,shift);intround=len/step;for(inti=0;i<step;i++){intt=arr[i],index1=0,index2=0;for(intj=0;j<round-1;j++){index1=(i+shift*j)%len;index2=(index1+shift)%len;arr[index1]=arr[index2];}arr[index2]=t;}}/***辗转相除法求最大公约数*要求a>0&&b>0*/publicstaticintGCD(inta,intb){while(b!=0){intt=a;a=b;b=t%b;}returna;}