左循环旋转一个串的5种方法
来源:互联网 发布:excel标识重复数据 编辑:程序博客网 时间:2024/06/10 00:31
/*功能:将一个整型数组左循环旋转i个位置*/
#include<stdio.h>
#include<stdlib.h>
#define WAYS_FIR 1
#define WAYS_SEC 2
#define WAYS_THI 3
#define WAYS_FOU 4
#define WAYS_FIF 5
static void swap(int *a,int *b){
int tmp=*a;
*a=*b;
*b=tmp;
}
/*翻转一个整数数组中整数的排列顺序*/
static void reverse(int *array,int n)
{
int i;
for(i=0;i<n/2;i++){
swap(&array[i],&array[n-1-i]);
}
}
/*i个辅助空间*/
static void left_rotate1(int *array,int n,int i)
{
int *tmp_arr=(int *)malloc(sizeof(int)*i);
int j;
for(j=0;j<i;j++){
tmp_arr[j]=array[j];
}
for(;j<n;j++){
array[j-i]=array[j];
}
for(j=0;j<i;j++){
array[n-i+j]=tmp_arr[j];
}
free(tmp_arr);
}
/*一个辅助变量*/
static void left_rotate2(int *array,int n,int i)
{
int j;
for(j=0;j<i;j++){
int k;
int key=array[0];
for(k=1;k<n;k++){
array[k-1]=array[k];
}
array[n-1]=key;
}
}
/*拉链法*/
static void left_rotate3(int *array,int n,int i)
{
int count=0;
int j;
for(j=0;j<i && count<n;j++){
int k;
for(k=j;(k+i)%n!=j;k+=i){
swap(&array[k%n],&array[(k+i)%n]);
count++;
}
count++;
}
}
/* 递归求解*/
static void left_rotate4(int *array,int n,int i)
{
if(n<=i || i==0) return;
int min=(n-i)>i?i:(n-i);
int j;
for(j=0;j<min;j++){
swap(&array[j],&array[n-min+j]);
}
if(min==i) left_rotate4(array,n-i,i);
else left_rotate4(array+n-i,i,2*i-n);
}
/*翻手法*/
static void left_rotate5(int *array,int n,int i)
{
reverse(array,i);
reverse(array+i,n-i);
reverse(array,n);
}
static void left_rotate(int *array,int n,int i,int choice)
{
switch(choice)
{
case WAYS_FIR:
left_rotate1(array,n,i);
break;
case WAYS_SEC:
left_rotate2(array,n,i);
break;
case WAYS_THI:
left_rotate3(array,n,i);
break;
case WAYS_FOU:
left_rotate4(array,n,i);
break;
case WAYS_FIF:
left_rotate5(array,n,i);
break;
default:
printf("error switch!\n");
exit(EXIT_FAILURE);
}
}
int main(int argc,char *argv[])
{
int array[23]={0,1,2,3,4,5,6,7,8,9,10,11,
12,13,14,15,16,17,18,19,20,21,22};
left_rotate(array,23,7,WAYS_FOU);
int i;
for(i=0;i<23;i++){
printf("%d ",array[i]);
}
printf("\n");
return 0;
}
- 左循环旋转一个串的5种方法
- 数组循环左移的一种方法
- 字符串的左旋转
- 字符串的左旋转
- 字符串的左旋转
- 字符串的左旋转
- 左旋转字符串(数组循环移位)
- 数组循环移位(左旋转字符串)
- 实现一个简单的按钮实例-上下左右,左旋转,右旋转,放大缩小。
- 实现一个简单的按钮实例-上下左右,左旋转,右旋转,放大缩小。代码重构
- 图片的左旋转,右旋转操作!
- 字符串的左旋转操
- 编程珠玑之左旋转一个字符串
- 【字符串5】左旋转字符串
- 字串的循环旋转
- 写一个函数可以左旋转字符串的k个字符
- 将一个字符串的前n个字符旋转到后面,采用左旋,或者右旋。
- 左旋一个字符串中k个字符的三种方法
- 北京北-延庆S2线时刻表
- 颜色表
- 关于OpenGL的编译错误
- 这两天调了下iic
- Qt之hello world
- 左循环旋转一个串的5种方法
- oracle 琐碎题目
- Linux kernel scaling: Ports and port Cycling
- 重复是如何产生的?
- .NET组件程序设计 第8章 多线程和并发管理 同步线程_互斥
- 类似360的拖动窗体,不规则窗体
- JOJ 1089 & ZOJ 1060 & poj 1094 Sorting It All Out (邻接表的栈拓扑排序模板)
- Unix常用命令
- [suDLS.mel]3Delight渲染shave自动化工具