您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何使用C語(yǔ)言編程C++旋轉(zhuǎn)字符操作串”,在日常操作中,相信很多人在如何使用C語(yǔ)言編程C++旋轉(zhuǎn)字符操作串問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”如何使用C語(yǔ)言編程C++旋轉(zhuǎn)字符操作串”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
旋轉(zhuǎn)字符串
字符串左旋
題前認(rèn)知:
暴力移位:
三步翻轉(zhuǎn):
判斷字符串旋轉(zhuǎn)
題前認(rèn)知
字符串追加判斷
實(shí)現(xiàn)一個(gè)函數(shù),可以左旋字符串中的k個(gè)字符。
例如:
ABCD左旋一個(gè)字符得到BCDA
ABCD左旋兩個(gè)字符得到CDAB
一個(gè)字符串如果就定死了。eg:char arr[]=“dfdf”什么的那多沒意思,一點(diǎn)都沒有人機(jī)交互的感覺,(雖然現(xiàn)在人機(jī)交互適合個(gè)體,不適合集群,但也是比死板的定死字符串舒服)
所以字符串得是我們可輸入的,才有可玩性,玩的不盡性就循環(huán)
#include<stdio.h> #include<string.h> char* turn_left(char* arr, int num) { int len = strlen(arr); int i = 0; //左旋數(shù)是多少就進(jìn)行幾次移位 for (i = 0; i < num; i++) { //每次移位就是單次左旋 int j = 0; char tmp = arr[0];//每次都把首元素存起來(lái) for (j = 0; j < len-1; j++) { arr[j] = arr[j + 1]; } arr[len-1] = tmp;//把存起來(lái)的首元素放到最后一位 } return arr; } int main() { char arr[100] = {0}; int num = 0; while (1) { printf("請(qǐng)輸入想要旋轉(zhuǎn)的字符串:>"); gets(arr); printf("請(qǐng)輸入想要左旋數(shù):>"); scanf("%d", &num); getchar();//這個(gè)的作用是清空緩沖區(qū),因?yàn)槊看蝧canf會(huì)有一個(gè)\n,不清空的話 //下一次到了gets,他會(huì)認(rèn)為\n是我們打進(jìn)去的,所以scanf之后必須清空緩沖區(qū) printf("左旋字符串為:%s\n", turn_left(arr, num)); } return 0; }
輸出結(jié)果
#include<stdio.h> #include<string.h> #include<assert.h> void reverse(char* head, char* tail) //字符串逆序 { assert(head && tail);//斷言阻止空指針 char tmp = 0; char* ptmp = &tmp; while (head<tail) { tmp = *head; *head = *tail; *tail = tmp; head++; tail--; } return 0; } char* turn_left(char* arr, int num) { assert(arr); int len = strlen(arr); if (len) { int n = num % len; //防止num會(huì)越界操作,所以必須是num模len才可,還要保證len不為0 reverse(arr, &arr[n - 1]); //逆序左邊 reverse(&arr[n], &arr[len - 1]); //逆序右邊 reverse(arr, &arr[len - 1]); //逆序整體 return arr; } else { return arr; } } int main() { char arr[100] = {0}; int num = 0; while (1) { printf("請(qǐng)輸入想要旋轉(zhuǎn)的字符串:>"); gets(arr); printf("請(qǐng)輸入想要左旋數(shù):>"); scanf("%d", &num); getchar();//這個(gè)的作用是清空緩沖區(qū),因?yàn)槊看蝧canf會(huì)有一個(gè)\n,不清空的話 //下一次到了gets,他會(huì)認(rèn)為\n是我們打進(jìn)去的,所以scanf之后必須清空緩沖區(qū) printf("左旋字符串為:%s\n", turn_left(arr, num)); } return 0; }
還有3種方法但那三種就需要很強(qiáng)的數(shù)學(xué)功底了,具體的我也看不懂他怎么證明的數(shù)學(xué)公式,就不看了。哈哈哈
寫一個(gè)函數(shù),判斷一個(gè)字符串是否為另外一個(gè)字符串旋轉(zhuǎn)之后的字符串。
例如:給定s1 =AABCD和s2 = BCDAA,返回1
給定s1=abcd和s2=ACBD,返回0.
AABCD左旋一個(gè)字符得到ABCDA
AABCD左旋兩個(gè)字符得到BCDAA
AABCD右旋一個(gè)字符得到DAABC
大家現(xiàn)在應(yīng)該知道我干啥,沒錯(cuò)我倡導(dǎo)交互,兩個(gè)字符串都是我們寫
(面試的時(shí)候能用庫(kù)函數(shù)就用庫(kù)函數(shù))
什么叫字符串追加判斷呢 例如asdfg這個(gè)字符串
#include<stdio.h> #include<string.h> #include<assert.h> int is_left_move(char* str1, char* str2) { assert(str1 && str2); int len1 = strlen(str1); int len2 = strlen(str2); //長(zhǎng)度不同就肯定不是旋轉(zhuǎn)字符串 if (len1 - len2) return 0; //在arr1字符串中追加一個(gè)自己 strncat(str1, str1, len1); //判斷判斷的那個(gè)字符串是不是追加字符串的子串 char* ret = strstr(str1, str2); if (ret == NULL) return 0; else return 1; } int main() { char arr1[50] = {0};//有足夠的空間 char arr2[50] = {0}; while (1) { printf("請(qǐng)輸入字符串:>"); gets(arr1); printf("請(qǐng)輸入需判斷的旋轉(zhuǎn)字符串:>"); gets(arr2); int ret = is_left_move(arr1, arr2); if (ret == 1) { printf("是旋轉(zhuǎn)字符串\n"); } else { printf("不是旋轉(zhuǎn)字符串\n"); } } return 0; }
結(jié)果
到此,關(guān)于“如何使用C語(yǔ)言編程C++旋轉(zhuǎn)字符操作串”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。