摘要:對(duì)于這題,我們要特別注意的是是字符串中的字符反向排列,不是逆序打印下面我會(huì)分別用非遞歸和遞歸的方法介紹本題。調(diào)用實(shí)現(xiàn)字符串逆序的函數(shù)。當(dāng)字符串的長(zhǎng)度為奇數(shù)時(shí),中間只剩一個(gè)數(shù)組元素,并不需要交換,增加限制條件,讓遞歸最后停下。
對(duì)于這題,我們要特別注意的是:是字符串中的字符反向排列,不是逆序打印!
下面我會(huì)分別用非遞歸和遞歸的方法介紹本題。
- 定義一個(gè)數(shù)組。
- 調(diào)用實(shí)現(xiàn)字符串逆序的函數(shù)?!?strong>本題核心
- 打印交換后的數(shù)組。
int main(){ char arr[] = "abcdefg"; reverse_string(arr); printf("%s/n",arr); return 0;}
int my_strlen(char* arr){ int count = 0; while (*arr!="/0") { count++; arr++; } return count;}
- 定義函數(shù)類型:這里只是交換數(shù)組,不需要參數(shù)返回,所以用void。
- 定義兩個(gè)指針:char* left和char* right,分別指向數(shù)組首元素地址和數(shù)組最后一個(gè)元素的地址。
- 交換數(shù)組元素。
void reverse_string(char* arr){ char* left = arr; char* right = arr + my_strlen(arr) - 1; //my_strlen計(jì)算出的數(shù)組長(zhǎng)度包括了‘/0’,因此-1獲得整個(gè)數(shù)組的長(zhǎng)度,再+arr指向最后一個(gè)元素的地址。 while (left < right) { char tmp = *left; *left = *right; *right = tmp; left++; right--; }}
解題思路:
- 數(shù)組char arr[] = "a b c d e f g /0" 中,每一次都交換第一個(gè)元素和最后一個(gè)元素,再加上中間元素的交換函數(shù)。
- 如:第一次交換 "g? reverse_string(char* arr)? a? /0"。注意:先不著急把a(bǔ)放入最后一個(gè)元素的地址中,令最后一個(gè)數(shù)組元素成‘/0’,a存儲(chǔ)到臨時(shí)變量tmp里。如:"g? reverse_string(char* arr)??/0",?tmp=a。(原因:逆序函數(shù)傳進(jìn)去的是一個(gè)字符串。若不這樣操作逆序函數(shù)再次調(diào)用的時(shí)候無法進(jìn)行,因?yàn)榇藭r(shí)中間剩余元素不是一個(gè)字符串)
- 實(shí)現(xiàn)遞歸都要有一個(gè)限制條件,若沒有限制條件則會(huì)出現(xiàn)死遞歸。當(dāng)字符串的長(zhǎng)度為奇數(shù)時(shí),中間只剩一個(gè)數(shù)組元素,并不需要交換,增加限制條件if(strlen(arr)>1),讓遞歸最后停下。
- 最后把第一個(gè)元素放入最后一個(gè)元素的地址中。
void reverse_string(char* arr){ char* left = arr; char* right = arr + my_strlen(arr) - 1; char tmp = *left; //臨時(shí)變量,暫時(shí)存放第一個(gè)數(shù)組元素 *left = *right; *right = "/0"; if(strlen(arr)>1) reverse_string(arr + 1); //left指針指向第二個(gè)數(shù)組元素 *right = tmp;}
#define _CRT_SECURE_NO_WARNINGS 1#includeint my_strlen(char* arr){ int count = 0; while (*arr!="/0") { count++; arr++; } return count;}非遞歸版本//void reverse_string(char* arr)//{// char* left = arr;// char* right = arr + my_strlen(arr) - 1;// while (left < right)// {// char tmp = *left;// *left = *right;// *right = tmp;// left++;// right--;// }//}void reverse_string(char* arr){ char* left = arr; char* right = arr + my_strlen(arr) - 1; char tmp = *left; *left = *right; *right = "/0"; if(strlen(arr)>1) reverse_string(arr + 1); *right = tmp;}int main(){ char arr[] = "abcdefg"; reverse_string(arr); printf("%s/n",arr); return 0;}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/123959.html
摘要:那假如我們用遞歸來描述這種情況呢定義基本情況其它情形所以在上述求和中的定義又用到了自己本身的定義,這就構(gòu)成了遞歸。 說起遞歸,我覺得其實(shí)大部分人應(yīng)該是不陌生的,遞歸廣泛存在于生活中。比如: showImg(https://segmentfault.com/img/remote/1460000007420204?w=294&h=450); The woman in this image ...
摘要:當(dāng)?shù)竭_(dá)時(shí)等同于直接插入排序,此時(shí)序列已基本有序,所有記錄在統(tǒng)一組內(nèi)排好成有序序列。當(dāng)面對(duì)大量數(shù)據(jù)時(shí),希爾排序?qū)⒈戎苯硬迦肱判蚋邇?yōu)勢(shì)圖示講解第一趟取增量,所有間隔為的元素分在一組,在各個(gè)組中分別進(jìn)行直接插入排序。 ...
摘要:第五題對(duì)稱二叉樹難度簡(jiǎn)單給定一個(gè)二叉樹,檢查它是否是鏡像對(duì)稱的。第十六題最大連續(xù)的個(gè)數(shù)難度簡(jiǎn)單給定一個(gè)二進(jìn)制數(shù)組,計(jì)算其中最大連續(xù)的個(gè)數(shù)。第十八題平方數(shù)之和難度簡(jiǎn)單給定一個(gè)非負(fù)整數(shù),你要判斷是否存在兩個(gè)整數(shù)和,使得。 寫在前面 最近忙著調(diào)教新裝備,沒有及時(shí)的寫題解,但是沒有在偷懶沒刷題喔~來認(rèn)真整理下最近做的題目~ 之前考慮按tag來刷題,后來收到了推薦的leetcode題解,就根據(jù)上...
摘要:語言在設(shè)計(jì)中考慮了函數(shù)的高效性和易用性兩個(gè)原則。在語言中,最常見的當(dāng)屬函數(shù)了。以上就是一個(gè)函數(shù),它被稱為語言的入口函數(shù),或者主函數(shù)。例如和都是函數(shù)名。形式參數(shù)當(dāng)函數(shù)調(diào)用完成之后就自動(dòng)銷毀了。 ...
閱讀 3205·2023-04-26 03:01
閱讀 3592·2023-04-25 19:54
閱讀 1691·2021-11-24 09:39
閱讀 1446·2021-11-19 09:40
閱讀 4368·2021-10-14 09:43
閱讀 2878·2019-08-30 15:56
閱讀 1544·2019-08-30 13:52
閱讀 1715·2019-08-29 13:05