青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

life02

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  197 隨筆 :: 3 文章 :: 37 評論 :: 0 Trackbacks

字符串面試題(一)字符串逆序

幾點說明

1. 所有題目全部來自網絡,書籍,或者我自己的面試經歷,本人只是負責搜集整理。在此對原作者表示感謝!

http://www.cnblogs.com/graphics/archive/2011/03/09/1977717.html
2. 我已經盡力確保文字及程序的正確性,但我畢竟是凡人,如果您發現了文章中的錯誤,或者有更好的解法,請一定留言相告,以免誤導大家!

3. 所有代碼都采用C/C++編寫

很早就準備寫一個字符串系列的面試題,本來已經寫好了,大概有十幾道題,但是寫完才發現,文章好長,連我自己都沒有耐心讀下去了,索性就將其拆分成幾個系列,一來分開后篇幅變小,看起來比較方便。二來也更有針對性,便于精雕細作。比如這篇,在原來的文章中只占很小的篇幅,但是獨立出來才發現,東西也不少。既然是第一篇,就來個最最簡單的字符串逆序吧。

字符串逆序可以說是最經常考的題目。這是一道入門級的題目,相信80%的程序員經歷過這道題。給定一個字符串s,將s中的字符順序顛倒過來,比如s="abcd",逆序后變成s="dcba"。

普通逆序

基本上沒有這么考的,放在這里主要是為了和后面的原地逆序做個對比。很簡單,直接分配一個與原字符串等長的字符數組,然后反向拷貝一下即可,

char *Reverse(char *s)
{
//將q指向字符串最后一個字符
char *q = s ;
while(*q++)
;
q
-= 2 ;

//分配空間,存儲逆序后的字符串。
char *p = new char[sizeof(char) * (q - s + 2)] ;
char *r = p ;

// 逆序存儲
while(q >= s)
*p++ = *q-- ;
*p = '\0' ;

return r ;
}

原地逆序

英文叫做in-place reverse。這是最常考的,原地逆序意味著不允額外分配空間,主要有以下幾種方法,思想都差不多,就是將字符串兩邊的字符逐個交換,如下圖。給定字符串"abcdef",逆序的過程分別是交換字符a和f,交換字符b和e,交換字符c和d。

一 設置兩個指針,分別指向字符串的頭部和尾部,然后交換兩個指針所指的字符,并向中間移動指針直到交叉。

char *Reverse(char *s)
{
// p指向字符串頭部
char *p = s ;

// q指向字符串尾部
char *q = s ;
while(*q)
++q ;
q
-- ;

// 交換并移動指針,直到p和q交叉
while(q > p)
{
char t = *p ;
*p++ = *q ;
*q-- = t ;
}

return s ;
}

二 用遞歸的方式,需要給定逆序的區間,調用方法:Reverse(s, 0, strlen(s)) ;

// 對字符串s在區間left和right之間進行逆序,遞歸法
char *Reverse( char *s, int left, int right )
{
if(left >= right)
return s ;

char t = s[left] ;
s[left]
= s[right] ;
s[right]
= t ;

Reverse(s, left
+ 1, right - 1) ;
}

三 非遞歸法,同樣指定逆序區間,和方法一沒有本質區別,一個使用指針,一個使用下標。

// 對字符串str在區間left和right之間進行逆序
char *Reverse( char *s, int left, int right )
{
while( left < right )
{
char t = s[left] ;
s[left
++] = s[right] ;
s[right
--] = t ;
}

return s ;
}

不允許臨時變量的原地逆序

上面的原地逆序雖然沒有額外分配空間,但還是使用了臨時變量,嚴格的說也算是額外的空間吧,如果再嚴格一點,連臨時變量也不允許的話,主要有下面兩種方法。一是異或操作,因為異或操作可以交換兩個變量而無需借助第三個變量,二是使用字符串的結束符'\0'所在的位置作為交換空間,這樣有個局限,就是只適合以'\0'結尾的字符串,對于不支持這種字符串格式的語言,就不能使用了。

使用字符串結束符'\0'所在的位置作為交換空間

// 使用字符串結束符'\0'所在的位置作為交換空間
char* Reverse(char* s)
{
char* r = s ;

// 令p指向結束符
char* p = s;
while (*p != '\0')
++p ;

// 令q指向字符串最后一個字符
char* q = p - 1;

// 使用p作為交換空間逐個交換字符
while (q > s)
{
*p = *q ;
*q-- = *s ;
*s++ = *p ;
}

*p = '\0' ; // 恢復結束符

return r ;
}

使用異或操作

// 使用異或操作對字符串s進行逆序
char* Reverse(char* s)
{
char* r = s ;

//令p指向字符串最后一個字符
char* p = s;
while (*(p + 1) != '\0')
++p ;

// 使用異或操作進行交換
while (p > s)
{
*p = *p ^ *s ;
*s = *p ^ *s ;
*p = *p-- ^ *s++ ;
}

return r ;
}

按單詞逆序

給定一個字符串,按單詞將該字符串逆序,比如給定"This is a sentence",則輸出是"sentence a is This",為了簡化問題,字符串中不包含標點符號。

分兩步

1 先按單詞逆序得到"sihT si a ecnetnes"

2 再整個句子逆序得到"sentence a is This"

對于步驟一,關鍵是如何確定單詞,這里以空格為單詞的分界。當找到一個單詞后,就可以使用上面講過的方法將這個單詞進行逆序,當所有的單詞都逆序以后,將整個句子看做一個整體(即一個大的包含空格的單詞)再逆序一次即可,如下圖所示,第一行是原始字符換,第二行是按單詞逆序后的字符串,最后一行是按整個句子逆序后的字符串。

代碼

// 對指針p和q之間的所有字符逆序
void ReverseWord(char* p, char* q)
{
while(p < q)
{
char t = *p ;
*p++ = *q ;
*q-- = t ;
}
}

// 將句子按單詞逆序
char* ReverseSentence(char *s)
{
// 這兩個指針用來確定一個單詞的首尾邊界
char *p = s ; // 指向單詞的首字符
char *q = s ; // 指向空格或者 '\0'

while(*q != '\0')
{
if (*q == ' ')
{
ReverseWord(p, q
- 1) ;
q
++ ; // 指向下一個單詞首字符
p = q ;
}
else
q
++ ;
}

ReverseWord(p, q
- 1) ; // 對最后一個單詞逆序
ReverseWord(s, q - 1) ; // 對整個句子逆序

return s ;
}

逆序打印

還有一類題目是要求逆序輸出,而不要求真正的逆序存儲。這題很簡單,有下面幾種方法,有的方法效率不高,這里僅是提供一個思路而已。

先求出字符串長度,然后反向遍歷即可。

void ReversePrint(const char* s)
{
int len = strlen(s) ;
for (int i = len - 1; i >= 0; --i)
cout
<< s[i];
}

如果不想求字符串的長度,可以先遍歷到末尾,然后在遍歷回來,這要借助字符串的結束符'\0'。

void ReversePrint(const char* s)
{
const char* p = s ;

while (*p)
*p++ ;

--p ; //while結束時,p指向'\0',這里讓p指向最后一個字符

while (p >= s)
{
cout
<< *p ;
--p ;
}
}

對于上面第二種方法,也可以使用遞歸的方式完成。

void ReversePrint(const char* s)
{
if(*(s + 1) != '\0')
ReversePrint(s
+ 1) ;
cout
<< *s ;
}

關于數組的面試題,請看這里

== THE END==

Happy coding!

作者:zdd
出處:http://www.cnblogs.com/graphics/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利.
posted on 2012-02-21 16:26 life02 閱讀(612) 評論(0)  編輯 收藏 引用 所屬分類: 筆試
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩福利在线观看| 亚洲欧美日本国产有色| 中国成人在线视频| 99视频有精品| 亚洲一区二区免费视频| 午夜精品久久久久久久99水蜜桃| 亚洲欧美精品suv| 欧美在线高清视频| 久久婷婷影院| 91久久在线播放| 亚洲剧情一区二区| 亚洲永久在线| 毛片基地黄久久久久久天堂| 欧美日韩国产一级| 国产一区在线看| 亚洲精品一区中文| 欧美在线视频在线播放完整版免费观看 | 亚洲国产另类精品专区| 日韩视频免费看| 久久精品一区二区三区中文字幕 | 亚洲手机成人高清视频| 欧美影院在线播放| 欧美日韩成人一区二区| 国产一区二区三区高清播放| 妖精成人www高清在线观看| 久久嫩草精品久久久精品| 91久久久久久| 欧美福利电影在线观看| 国产精品福利在线| 亚洲大胆视频| 亚洲欧美日韩一区二区三区在线| 你懂的一区二区| 亚洲欧美视频一区二区三区| 欧美日本中文字幕| 亚洲精品乱码久久久久久久久| 久久精品动漫| 亚洲视频精选在线| 欧美日韩国产欧| 亚洲精品在线观看视频| 免费日韩成人| 欧美专区在线播放| 国产无遮挡一区二区三区毛片日本| 亚洲三级网站| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲丝袜av一区| 欧美日韩一区二区三区在线视频 | 亚洲毛片播放| 你懂的一区二区| 欧美在线日韩| 国产亚洲欧美在线| 欧美一区二区三区在| 亚洲一区视频| 国产精品一区免费在线观看| 亚洲一区二区三区国产| 99精品国产在热久久婷婷| 欧美精品久久久久久| 亚洲美女中出| 亚洲精品永久免费精品| 欧美日韩大片一区二区三区| 一本色道久久综合亚洲精品不卡| 亚洲国产精品成人| 欧美激情一区二区三区全黄 | 玖玖玖国产精品| 久久精品国产成人| 在线日本成人| 亚洲国产精品视频一区| 欧美国产日韩一二三区| 一区二区三区高清在线观看| 99天天综合性| 国产美女精品视频| 蜜臀va亚洲va欧美va天堂| 裸体丰满少妇做受久久99精品| 亚洲激情成人在线| 一本大道久久a久久综合婷婷 | 国内精品久久久久影院薰衣草| 久久久欧美一区二区| 久久亚洲一区| 一区二区三区视频观看| 亚洲天堂av综合网| 亚洲在线视频免费观看| 亚洲一区二区三区中文字幕在线| 国产欧美一区在线| 久久综合影视| 欧美日本精品在线| 久久久91精品| 欧美精品一区二区蜜臀亚洲| 亚洲午夜免费福利视频| 欧美一区二区三区在线观看 | 伊人精品久久久久7777| 欧美护士18xxxxhd| 国产精品国产三级国产专播精品人| 久久se精品一区二区| 女女同性女同一区二区三区91| 亚洲一区精品电影| 久久免费精品视频| 亚洲欧美999| 另类天堂av| 欧美一区二区三区精品| 欧美91大片| 久久精品综合一区| 欧美另类在线观看| 久热这里只精品99re8久| 欧美色视频在线| 亚洲第一主播视频| 国产日韩一区| 夜夜嗨av一区二区三区免费区| 亚洲成人在线网| 午夜激情久久久| 国产精品99久久99久久久二8| 欧美在线免费视频| 欧美一级大片在线观看| 欧美日韩亚洲一区二区| 老司机免费视频一区二区| 国产精品视频精品| 日韩视频一区二区三区在线播放免费观看 | 99在线|亚洲一区二区| 久久精品亚洲一区二区| 亚洲欧美中文日韩在线| 欧美日韩国产一中文字不卡| 欧美电影资源| 亚洲国产成人不卡| 久久久久国产精品一区三寸| 欧美专区在线| 国产精品区一区二区三区| 一本久久a久久免费精品不卡| 亚洲区国产区| 欧美大片国产精品| 欧美华人在线视频| 亚洲激情一区二区三区| 欧美刺激午夜性久久久久久久| 欧美成人第一页| 亚洲黄色成人网| 欧美大片免费观看| 亚洲国产专区| 99综合视频| 欧美视频在线一区二区三区| 夜夜嗨av一区二区三区中文字幕 | 欧美日韩精品在线播放| 欧美成人三级在线| 亚洲高清在线| 欧美成人精品福利| 亚洲三级毛片| 亚洲一区二区三区午夜| 国产精品啊v在线| 亚洲女性裸体视频| 久久男人av资源网站| 亚洲国产美女| 欧美日韩精品一本二本三本| av成人毛片| 久久国产婷婷国产香蕉| 激情综合久久| 欧美激情片在线观看| 夜夜躁日日躁狠狠久久88av| 久久成人18免费网站| 曰本成人黄色| 欧美日韩裸体免费视频| 亚洲天堂av电影| 狂野欧美一区| 亚洲精品一区二| 国产精品国产三级国产普通话99 | 国产精品欧美日韩一区二区| 欧美一区二区国产| 亚洲高清在线视频| 亚洲免费一级电影| 在线国产精品播放| 欧美日本免费| 午夜精品影院| 亚洲国产精品嫩草影院| 香蕉久久国产| 亚洲激情一区二区| 国产精品亚洲一区| 麻豆精品在线视频| 亚洲欧美电影在线观看| 欧美黑人在线观看| 欧美在线视频一区二区| 亚洲看片网站| 国内精品久久久久影院薰衣草| 欧美另类综合| 久久九九国产精品| 亚洲午夜在线| 最新国产精品拍自在线播放| 久久久久久久久久久一区| 一区二区久久久久久| 悠悠资源网久久精品| 国产精品va在线| 欧美国产日本在线| 久久五月天婷婷| 性色av一区二区三区在线观看| 亚洲欧洲日产国码二区| 麻豆精品在线观看| 校园激情久久| 亚洲一区二区久久| 99ri日韩精品视频| 亚洲第一中文字幕在线观看| 国产一区二区三区在线观看免费 | 亚洲人成小说网站色在线| 国产亚洲欧美日韩一区二区| 国产精品成人在线| 欧美日本一区二区高清播放视频| 老司机免费视频久久|