左旋字符
問題描述:
?實現一個函數,可以左旋字符串中的k個字符。
AABCD左旋一個字符得到ABCDA
AABCD左旋兩個字符得到BCDAA
法一:通過移動字符實現左旋
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>char *leftstring(char *str, int num,int len)
{char arr[10];char *p = str,*q = str;int i = 0;for (i = 0; i < num; i++) //比如我們需要左旋兩個字符串,那么先把原字符串的最前面的兩個字符存起來{arr[i] = *p++;}p = str;p += num; //用p指向需要前移的第一個字符for (i = num; i < len-1; i++) //從第一個字符開始依次把后面的字符前移,做前移操作,i控制次數{*str++ = *p++;}for (i = 0; i < num; i++) //把剛剛取出來的字符,存到原字符串前移后的后面{*str++ = arr[i];}return q;
}int main()
{char arr[] = "AABCD";int len = sizeof(arr) / sizeof(arr[0]);leftstring(arr, 2, len);printf("%s\n",arr);system("pause");return 0;
}
法二:通過置換函數進行左旋操作
比如abcd1234,如果我們想左旋四個,我們可以先把前面四個逆序得到dcba,接著把后面逆序得到4321,這樣兩次逆序后的結果是dcba4321,然后再整體逆序,得到了1234abcd,同樣的方法大家可以試一下左旋兩個是不是同樣的效果
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<windows.h>//通過置換函數進行左旋操作void swap(char *p, char *q) //置換兩個字符
{assert(p); //每次傳入一個地址時進行斷言,防止傳址出錯assert(q);*p ^= *q;*q ^= *p;*p ^= *q;
}char *ReverseOrder(char *left, char *right) //置換一組字符
{assert(left);assert(right);char *arr = left;while (arr < right){swap(arr, right);arr++, right--;}return left;
}char *leftstring(char *str, int num,int len) //通過前后字符替換實現左旋
{assert(str);char *string = str; num = num % len; //加上一個取余的操作,目的是如果左旋的次數大于字符串的長度,比如該題如果是9,實際的結果只左旋了一次ReverseOrder(string, string + num - 1); //先置換前一部分,再置換后一部分,然后整體置換ReverseOrder(string + num, string + len - 1);ReverseOrder(string, string + len - 1);return str;
}int main()
{char arr[] = "abcd1234";int len = (sizeof(arr) / sizeof(arr[0])) - 1;leftstring(arr, 2, len);printf("%s\n",arr);system("pause");return 0;
}
法三:通過在拼接進行左旋,把和原字符串同樣內容的字符串拼接在原字符串的后面
分析如下,如果我們的原字符串是abcd1234,現在我左旋2,想要得到的結果是cd1234ab,我使用本方法是在原字符串的后面拼接一整個,得到abcd1234abcd1234,然后從第三個字符開始把內容依次復制到原字符串中去,循環的次數是8.
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<windows.h>
#include<string.h>//通過在拼接進行左旋,把和原字符串同樣內容的字符串拼接在原字符串的后面char *leftstring(char *str, int num, int len)
{assert(str);int i = 0;char *string = str;char *arr = (char *)malloc(2*len + 1); //開辟空間使2*len+1,其中+1位為了給結尾處留有一個'\0'的空間num = num % len;strcpy(arr,string);strcat(arr,string);for (i = 0; i < len; i++){*string++ = arr[i+num];}return str;
}int main()
{char arr[] = "abcd1234";int len = (sizeof(arr) / sizeof(arr[0])) - 1;leftstring(arr, 2, len);printf("%s\n",arr);system("pause");return 0;
}
總結
- 上一篇: Python爬虫2-GET_POST与开
- 下一篇: “鲁史有其说”上一句是什么