赞
踩
在数组中定义一个字符串,该字符串由“ abcdef ” 组成,所谓左旋即是让左边的第一个字符旋转到右边去,左旋一个字符即是产生“ bcdefa ”这样的字符串,右旋与之相反。
为了控制左(右)旋的字符数,需要制作一个可以改变旋转字符数的函数。
字符串的旋转的主要si思想是将需要寻转的字符先进行存储,然后将剩余的不需要旋转的字符移位,将需要旋转的字符的位置取代,为旋转的字符留下足够的空间来存储旋转字符。所以先建立一个数组,将旋转字符存储在内,然后将原数组内的元素移位后面的元素取代其前面的元素,但万不可将 " \0 " 移动或取代,要始终保证 " \0 " 在其原来的位置,然后将所存储的元素再次赋值到原数组中,完成旋转。最后再将数组元素循环打印在屏幕上。
- #include<stdio.h>
- int main()
- {
- char arr1[] = "abcdef";
- char arrc[10] = "NULL";
- int sz = 0;
- scanf_s("%d", &sz);
- int i = 0;
- for (i = 0; i < sz; i++)
- {
- arrc[i] = arr1[i];
- }
- for (i = 0; arr1[i + sz] != '\0'; i++)
- {
- arr1[i] = arr1[i + sz];
- }
- int j = 0;
- for (j = 0; j < sz; j++)
- {
- arr1[i] = arrc[j];
- i++;
- }
- for (i = 0; arr1[i] != '\0'; i++)
- {
- char tmp = NULL;
- tmp = arr1[i];
- printf("%c", tmp);
- }
- system("pause");
- return 0;
- }

右旋与左旋相反,但右旋的逻辑较难,在右旋中,先要计算原数组的元素个数,为后面的逻辑推导建立基础。
右旋的数组从最右端的元素开始存储时,一定要跳过 " \0 " 然后进行拷贝存储,而所得到的sz是整个数组的长度,当
" sz-1 ",时所得到的yuan元素是指向 " \0 " 的·,这时再根据你要需要的旋转个数进行旋转,而在存储完成后,则要将原数组的元素进行移位,在这时,循环的判断条件是最大的移位次数,比如原有"abcdef"六个元素,而你需要旋转两个,则就要将剩下的四个元素移位四次。移位的次数是不会有多余的元素进行交换,然后移位时是将前面的元素将后移动:[sz - 1-1 - as - i]
这个表达式表示的是数组前面的元素,[sz - 1-1 - i],这个表达式表示的是后面的元素,将前面的元素赋值到后面的位置处,将原来的位置清理出来为所要旋转的元素的存储做准备。zhi'之后再将旋转的元素按照位置一 一赋值到原数组准备的位置处,完成旋转,然后循环打印在屏幕上。
- #include<stdio.h>
- int main()
- {
- char arr1[] = "abcdef";
- char arrc[10] = "NULL";
- int i = 0;
- int as = 0;
- scanf_s("%d", &as);
- int sz = sizeof(arr1) / sizeof(arr1[0]);
- for (i = 0; i < as; i++)
- {
- arrc [i] = arr1[sz-1-as+i];
- }
- for (i = 0;i!=sz-1-as;i++)
- {
- arr1[sz - 1-1 - i] = arr1[sz - 1-1 - as - i];
- }
- int j = 0;
- i = 0;
- for (j = 0; j <as; j++)
- {
- arr1[i] = arrc[j];
- i++;
- }
- for (i = 0; arr1[i] != '\0'; i++)
- {
- char tmp = NULL;
- tmp = arr1[i];
- printf("%c", tmp);
- }
- system("pause");
- return 0;
- }

以上的两种方法叫做暴力旋转法,这种旋转的方法效率比较低,为了提高效率,可以用三部旋转法。三部移位就是利用巧字符元素中间的转换,只用三次就将字符串完成旋转,如果想要移位三个字符,第一步:就先将前(后)三个字符进行倒位,第二部:将剩下的字符进行倒位,第三部:将所有的字符进行倒位,就得到了移位后的字符串。这种方法的思想是 一个字符串如果倒位了两次,就相当于没有进行倒位,所以最后得到的 子 字符串的的字符顺序并未发生改变,而 总 的字符串的顺序发生了改变,使字符串的旋转变得简单高效。以下是代码示例(左旋);(认真阅读注释,有具体过程的解析)
- #include<stdio.h>
- #include<assert.h>
- void ELoopMove(char *lift,char* right)//这是将字符串进行倒位的函数
- {
- assert(lift&&right);
- while (lift < right)
- {
- char tmp = NULL;
- tmp = *lift;
- *lift = *right;
- *right = tmp;
- lift++;
- right--;
- }
- }
- void LoopMove(char *arr, int as,int i)
- {
- assert(arr != NULL);
- ELoopMove(arr, arr + i - 1);//这代表的是旋转的 子 字符串的第一个字符和最后一个字符
- ELoopMove(arr + i, arr + as - 2);//这代表的是剩余的字符串的第一位和最后一位
- //如果是(arr+i,arr+as-1)的话,指针就指向了'\0'的位置,
- //所以要在"-1"的基础上再减一,使指针指向'\0'前的一个字符
- ELoopMove(arr, arr + as - 2);//这代表的是两次倒位后的总的字符串的第一位和最后一位
- }
- int main()
- {
- char arr[] = "asdfghj";
- int i = 0;
- int sz = 0;
- scanf_s("%d", &i);
- sz = sizeof(arr);
- LoopMove(arr,sz, i);//通过传递地址的方式使内部变量被外部函数进行改变
- printf("%s\n", arr);//调用函数通过地址的改变从而将arr的值进行改变
- system("pause");
- return 0;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。