左旋字符
問題描述:
?實(shí)現(xiàn)一個(gè)函數(shù),可以左旋字符串中的k個(gè)字符。
AABCD左旋一個(gè)字符得到ABCDA
AABCD左旋兩個(gè)字符得到BCDAA
法一:通過移動字符實(shí)現(xiàn)左旋
#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++) //比如我們需要左旋兩個(gè)字符串,那么先把原字符串的最前面的兩個(gè)字符存起來{arr[i] = *p++;}p = str;p += num; //用p指向需要前移的第一個(gè)字符for (i = num; i < len-1; i++) //從第一個(gè)字符開始依次把后面的字符前移,做前移操作,i控制次數(shù){*str++ = *p++;}for (i = 0; i < num; i++) //把剛剛?cè)〕鰜淼淖址?#xff0c;存到原字符串前移后的后面{*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;
}
法二:通過置換函數(shù)進(jìn)行左旋操作
比如abcd1234,如果我們想左旋四個(gè),我們可以先把前面四個(gè)逆序得到dcba,接著把后面逆序得到4321,這樣兩次逆序后的結(jié)果是dcba4321,然后再整體逆序,得到了1234abcd,同樣的方法大家可以試一下左旋兩個(gè)是不是同樣的效果
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<windows.h>//通過置換函數(shù)進(jìn)行左旋操作void swap(char *p, char *q) //置換兩個(gè)字符
{assert(p); //每次傳入一個(gè)地址時(shí)進(jìn)行斷言,防止傳址出錯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) //通過前后字符替換實(shí)現(xiàn)左旋
{assert(str);char *string = str; num = num % len; //加上一個(gè)取余的操作,目的是如果左旋的次數(shù)大于字符串的長度,比如該題如果是9,實(shí)際的結(jié)果只左旋了一次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;
}
法三:通過在拼接進(jìn)行左旋,把和原字符串同樣內(nèi)容的字符串拼接在原字符串的后面
分析如下,如果我們的原字符串是abcd1234,現(xiàn)在我左旋2,想要得到的結(jié)果是cd1234ab,我使用本方法是在原字符串的后面拼接一整個(gè),得到abcd1234abcd1234,然后從第三個(gè)字符開始把內(nèi)容依次復(fù)制到原字符串中去,循環(huán)的次數(shù)是8.
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<windows.h>
#include<string.h>//通過在拼接進(jìn)行左旋,把和原字符串同樣內(nèi)容的字符串拼接在原字符串的后面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位為了給結(jié)尾處留有一個(gè)'\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;
}
總結(jié)
- 上一篇: Python爬虫2-GET_POST与开
- 下一篇: 在一台电脑上使用两个github账号