旋转阵列
2010年10月12日
23对“旋转数组”的响应
-
2010年10月12日上午9:51 […]今天的编程实践练习,我们的目标是编写一个函数,将数组旋转为选定的数字[…] -
2010年10月12日12:28 PM Python解决方案,类似于Remco的Haskell的逻辑: -
2010年10月13日12:22 AM 这里是 我的解决方案 F#中。 由于模运算符的定义方式,必须做一些额外的工作。 -
2010年10月13日凌晨4:11 http://pastebin.com/5wKvVgWG 使用n个交换进行就地轮换,并尝试具有相当好的局部性。 -
2010年10月13日上午6:53 阿勒·拉科特。 这是我第一次使用多个返回值。 #朗球拍 (需要(仅在rnrs/base-6 mod中) (定义(旋转a-vector rot) (如果(<=(向量长度a-向量)1) a-矢量 (带值的调用 (λ () (矢量-拆分-a矢量(mod-rot(矢量长度-a矢量)) (λ(1/2) (矢量-追加第二个第一个))) -
2010年10月13日上午10:18 ;; 口齿不清 ;; 返回原始数组,而不是像这样的循环列表块 ;; “rot l n=take(length l)$drop(如果(n>0),则n else(abs((length l)-n))$cycle l” (拆卸旋转(arr n) (let*(arlen(长度arr)) (new-arr(make-array arlen)) (阿伦下方i的循环 做 (setf(aref new-arr i)(aref arr(mod(+i n)arlen)) (阿伦下方i的循环 做 (setf(aref arr i)(aref new-arr i))) -
2010年10月13日下午4:03 ;; 简单、防弹。 (定义(反向范围!v开始-结束) (do((i开始(+i 1))) (j(-结束1)(-j 1)) ((>=i j)v) (let((tmp(矢量参考v i))) (向量集!v i(向量参考v j)) (向量集!v j tmp))) (定义(矢量旋转!v n) (let((N(向量长度v))) (除非(零?N) (let((n(模n n))) (反向范围!v 0 n) (反向范围!v n n) (反向范围!v 0 N)) v) ) -
2010年10月13日下午7:37 使用python列表理解: 定义rotate_array(arr,旋转): 对于范围(len(arr))中的i,返回[arr[(旋转+i)%len(arr)] -
2010年10月14日上午9:16 这是一个Java版本。 没有递归,只有一个普通循环。 不是最短的解决方案,但它可以处理所有边缘情况 (包括比数组大小更大的左旋转)。 -
2010年10月14日下午3:33 ;; 口齿不清 (卸下旋转(第一个参数) (第二 ((空lst)lst) ((=(mod arg(长度lst))0)lst) (t(旋转(nconc(cdr lst)(列表(车辆lst)))(-arg 1))) -
2010年10月15日上午6:52 这里的关键是不要使用预先准备好的旋转功能。 以下是我在Python中的解决方案: def旋转器(arrayOld,rotateValue): arrayLength=arrayOld__ 透镜_() while rotateValue>arrayLength:rotateValue-=arrayLongth 当rotateValue为0时: 对于范围内的i(arrayLength): 如果i<rotateValue:arrayNew_buffer.append(arrayOld[i]) else:arrayNew.append(arrayOld[i]) 其他: 对于范围内的i(arrayLength): 如果i<(arrayLength+rotateValue):arrayNew_buffer.append(array旧[i]) else:arrayNew.append(arrayOld[i]) 对于数组中的i New_buffer:arrayNew.append(i) 返回阵列新建 -
2010年10月15日上午11:31 /*这是我的C实现*/ #包括 #包括 int*rotate(int*a,int size,int count) { int*c,j,温度,k=0,符号; c=(int*)calloc(size,sizeof(int)); 符号=计数>>31; 温度=(符号==-0x01)? (size-(-count)):计数; 对于(j=(温度); j<尺寸; j++) { c[k]=a[j]; k++; } 对于(j=0;j<(温度); j++) { c[k]=a[j]; k++;} a=c; 返回a; } int主() { int*b,cnt,大小,i; printf(“输入数组大小?”); 扫描(“%d”,&size); b=(int*)胼胝体(大小,sizeof(int)); 对于(i=0;i<大小;i++) 扫描(“%d”,&b[i]); 而(1) { printf(“要旋转的元素数?\n\t\t向左旋转的正值\n\t\t向右旋转的负数\n\t\t输入“0”退出”); 扫描(“%d”,&cnt); 如果(cnt==0) { 退出(0); } 其他{ cnt=cnt%尺寸; b=旋转(b,尺寸,cnt); printf(“旋转数组\n”); 对于(i=0;i<大小;i++) printf(“\t%d”,b[i]); } } 返回0; } -
2010年10月15日上午11:31 #包括 #包括 int*rotate(int*a,int大小,int计数) { int*c,j,温度,k=0,符号; c=(int*)calloc(size,sizeof(int)); 符号=计数>>31; 温度=(符号==-0x01)? (size-(-count)):计数; 对于(j=(温度); j<尺寸; j++) { c[k]=a[j]; k++; } 对于(j=0;j<(temp); j++) { c[k]=a[j]; k++;} a=c; 返回a; } int主() { int*b,cnt,大小,i; printf(“输入数组大小?”); 扫描(“%d”,&size); b=(int*)calloc(size,sizeof(int)); 对于(i=0;i<大小;i++) 扫描(“%d”,&b[i]); 而(1) { printf(“要旋转的元素数?\n\t\t向左旋转的正值\n\t\t向右旋转的负数\n\t\t输入“0”退出”); 扫描(“%d”,&cnt); 如果(cnt==0) { 退出(0); } 其他{ cnt=cnt%尺寸; b=旋转(b,尺寸,cnt); printf(“旋转数组\n”); 对于(i=0;i<大小;i++) printf(“\t%d”,b[i]); } } 返回0; } -
2010年10月16日上午11:11 我的C实现 -
2010年10月17日下午4:32 我的python解决方案: http://codepad.org/nKk5LOLl -
2010年10月20日下午5:44 你们太棒了,我从你们的解决方案中学到了很多! 下面是我的emacs lisp实现(使用列表保存数组): (化解债务8r(an)) (如果 (=0(长度a)) 一 (项目 (追加 (nthcdr(mod n(长度a))a) (但最后一个a(-(长度a)(abs(mod n(长度b)))) )))) -
2010年10月26日下午3:49 […]编程实践,旋转数组。 我认为这更像是一种抵消。 将数组内容移位±x个空格。 公共静态[…] -
2010年12月7日凌晨2:38 这是我的C#。 -
2010年12月12日10:58 PM 用C语言完成,将数组旋转到位,而不是返回一个新数组。 我的解决方案中的实际旋转涉及(n+gcd(n,offset))赋值,不使用单个临时变量的额外内存设备。 如果n和offset是互质的,我们可以单次旋转数组; 如果没有,我们需要将其分解为gcd(n,offset)子问题。 (_gcd函数是我们为2010年1月15日的练习编写的函数) 我发现代码很难理解,不知道如何使它更容易阅读。 为了帮助澄清一点,以下是将长度为9的数组旋转偏移量为5时发生的情况: 5->tmp 0 -> 5 4 -> 0 8 -> 4 3 -> 8 7 -> 3 2 -> 7 6 -> 2 1 -> 6 tmp->1 并且同一阵列偏移6: 6->tmp 0 -> 6 3 -> 0 tmp->3 7->tmp 1 -> 7 4 -> 1 tmp->4 8->tmp 2 -> 8 5 -> 2 tmp->5 -
2013年12月9日下午5:40 这可以通过恒定的空间成本来实现,因为偏移平移=原点处的反射,然后是(原点+偏移)处的反射。 反射可以通过就地成对交换元素来实现。 -
2015年7月10日凌晨3:08 你好,我是新来的 //_________________________________________________________// #包括 使用命名空间标准; //_________________________________________________________// //确定绝对值和解释极值的函数 int AbsolShiftfunc(int用户,int ArrSize) { int Absolshift; int ShiftType; if(用户>=0) { Absolshift=用户; ShiftType=1; if(UserArrSize) { while(Absolshift>ArrSize) { Absolshift=Absolshift–ArrSize; } } } else if(用户<=0) { Absolshift=-用户; ShiftType=0; if(-用户ArrSize) { while(Absolshift>ArrSize) { Absolshift=Absolshift–ArrSize; } } } 如果(ShiftType==1) { return Absolshift; } else if(ShiftType==0) { return——绝对位移; } } //_________________________________________________________// int IndivShiftfunc(int初始值,int Absolshift,int ArrSize) { int Destindex=初始+(Absolshift); if(目标索引>=ArrSize) { while(目标索引>=ArrSize) { Destinex=Destinex–ArrSize; } } if(目标索引<0) { while(目标索引ArrSize) { 目标索引=目标索引+ArrSize; } } return目的地索引; } //_______________________________________________________// 无效解决方案() { //声明任意原始数组和副本 常量int大小=700; int ArrO[size]; int ArrC[size]; int Arrsize=0; //换档前的培训 int用户移位; int AbsoluteShift; int目的地索引; //生命周期价值 const int Sentinel=-999; //要求用户指定值并计算查询数组大小 cout<<“\n\n\n\n”; cout<<“\t旋转数组\n\n\n”; cout<<“\t____________________________________________________________ \n\n\n”; cout<<“\t请指定要旋转的数组。\n\n\t在数组末尾输入-999。\n\n”; cout<>ArrO[Arrsize],cout<<“\n”; while(ArrO[Arrsize]!=哨兵) { Arrsize++; cout<>ArrO[Arrsize],cout<<“\n”; } cout<>用户移位,cout<<“\n”; //计算绝对偏移 AbsoluteShift=AbsolShiftfunc(用户偏移,Arrsize); //计算移位 for(int Counter=0;Counter<Arrsize;Counter++) { Destinationindex=IndivShiftfunc(计数器、AbsoluteShift、Arrsize); ArrC[Destinationindex]=ArrO[Counter]; } //显示原始阵列和旋转阵列 cout<<“\t*原始数组:_\n\n\t”; cout<<“\t\t[”; for(int Counter=0;Counter<Arrsize;Counter++) { cout<<ArrO[Counter]<<“,”; } cout<<“]\n\n\n”; cout<<“\t*旋转数组:_\n\n\t”; cout<<“\t\t[”; for(int Counter=0;Counter<Arrsize;Counter++) { cout<<ArrC[Counter]<<“,”; } cout<<“]\n\n”; cout<<“\t____________________________________________________________ \n\n\n\t”; } //_________________________________________________________// 空main() { 解决方案(); } //_________________________________________________________// 附言:我是个乞丐,所以请不要打我 -
2018年3月9日上午10:01 […]“块交换”算法。 Bentley还讨论了第三种算法,他称之为“反转”算法,这是我们几年前实现的。 宾利接着进行了时间比较[…]