题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数

问题描述

谁有简单的法子做这个题,尽量不要再新建另外的数组当初面试老师喊我不要用另外的数组这样: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;}

时间: 2024-09-08 14:04:32

题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数的相关文章

一道acm练习题目,发票统计的题目,怎么把整数弄成单精度的没想明白?问下

问题描述 一道acm练习题目,发票统计的题目,怎么把整数弄成单精度的没想明白?问下 发票统计 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 有一个小型的报账系统,它有如下功能: (1)统计每个人所报发票的总钱数 (2)统计每类发票的总钱数 将此系统简化为如下:假设发票类别共有A.B.C三种;一共有三个人,ID分别为1.2.3. 输入 系统输入包含三行,每行第一个数为人员ID(整型,1或2或3),第二个数为发票总张数(张数不超过100),之后是多个发票类别(

求帮助-怎样使下面的语句独立完成判断,每个判断语句都要执行的,上面的无论满不满足都要执行下面的

问题描述 怎样使下面的语句独立完成判断,每个判断语句都要执行的,上面的无论满不满足都要执行下面的 function checkform(myform){ for(i=0;i<myform.length;i++){ if(myform.elements[i].value==""){ alert(myform.elements[i].title+"不能为空!"); myform.elements[i].focus(); return false; } } if(

正则表达式验证整数但不包括某些数

问题描述 正则表达式验证整数但不包括某些数的问题!学习正则表达式的时候遇到一个问题,就是验证整数,但不包括某些数,我看一个中是这样写的java正则验证1-32的整数,但是不包括31,注意不包括31的方法:([12]?[1-9])|(10)|(20)|(30)|(32)这是啥意思呀?到底如何是用java正则表达式验证整数但不包括某些数? 解决方案 解决方案二:它这个就是穷举法嘛,每一个括号代表一种可能,|表示或([12]?[1-9])|(10)|(20)|(30)|(32)第一个括号里的([12]

c 递归 全排列-请教大神:如何使全排列按从小到大的顺序输出?

问题描述 请教大神:如何使全排列按从小到大的顺序输出? 现在只能输出全排列. 代码如下: #include int main() { void change(int *a,int *b,int temp); void pai(int *num,int i,int n); int num[10]; int i,n; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;++i) num[i]=i+1; pai(num,0,n-1); printf

4个整数按小到大的顺序排序(java)

问题描述 用if条件结构循环怎样写更简单! 解决方案 解决方案二:java.util.Arrays.sort()一句话搞定的东西这么折腾干嘛解决方案三:学生作业吧解决方案四:冒泡吧需要2个for解决方案五:引用1楼ticmy的回复: java.util.Arrays.sort()一句话搞定的东西这么折腾干嘛 这个最简单解决方案六:所有循环语句都可以用if-else表示.所以可以先利用循环写出排序,然后改成if-else.解决方案七:Arrays.sort()解决方案八:Arrays.sort()

C++ 算法大全

第3章 控制语句  /* 1.打印出所有的"水仙花数".所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如,153是一水仙花数,因为153 = 13 + 53 + 33. */ #include<iostream.h> void main() { int i, a=0, b=0, c=0; for(i=100;i<1000;i++) { a=i%10; b=i/10%10; c=i/100%10; if(a*a*a+b*b*b+c*

看看你的逻辑思维能力怎么样,经典题目,不要找答案哦!

问题描述 [程序1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....[程序2]题目:判断101-200之间有多少个素数,并输出所有素数.1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数.[程序3]题目:打印出所有的"水仙花数",所谓"水仙花数

最新java编程50题及答案

[程序1]    题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?    //这是一个菲波拉契数列问题 public class lianxi01 { public static void main(String[] args) { System.out.println("第1个月的兔子对数:    1"); System.out.println("第2个月的兔子对数:    

c语言课程设计-c语言数组问题,,,,,,,,,,

问题描述 c语言数组问题,,,,,,,,,, #includevoid main(){ int ijmna[20]; printf(""input ge shu n:""); scanf(""%d""&n); printf("" ""); printf(""input yi dong wei shu m:""); scanf("&