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

life02

  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  197 隨筆 :: 3 文章 :: 37 評(píng)論 :: 0 Trackbacks

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

幾點(diǎn)說(shuō)明

1. 所有題目全部來(lái)自網(wǎng)絡(luò),書籍,或者我自己的面試經(jīng)歷,本人只是負(fù)責(zé)搜集整理。在此對(duì)原作者表示感謝!

http://www.cnblogs.com/graphics/archive/2011/03/09/1977717.html
2. 我已經(jīng)盡力確保文字及程序的正確性,但我畢竟是凡人,如果您發(fā)現(xiàn)了文章中的錯(cuò)誤,或者有更好的解法,請(qǐng)一定留言相告,以免誤導(dǎo)大家!

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

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

字符串逆序可以說(shuō)是最經(jīng)常考的題目。這是一道入門級(jí)的題目,相信80%的程序員經(jīng)歷過這道題。給定一個(gè)字符串s,將s中的字符順序顛倒過來(lái),比如s="abcd",逆序后變成s="dcba"。

普通逆序

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

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

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

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

return r ;
}

原地逆序

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

一 設(shè)置兩個(gè)指針,分別指向字符串的頭部和尾部,然后交換兩個(gè)指針?biāo)傅淖址⑾蛑虚g移動(dòng)指針直到交叉。

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

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

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

return s ;
}

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

// 對(duì)字符串s在區(qū)間left和right之間進(jìn)行逆序,遞歸法
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) ;
}

三 非遞歸法,同樣指定逆序區(qū)間,和方法一沒有本質(zhì)區(qū)別,一個(gè)使用指針,一個(gè)使用下標(biāo)。

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

return s ;
}

不允許臨時(shí)變量的原地逆序

上面的原地逆序雖然沒有額外分配空間,但還是使用了臨時(shí)變量,嚴(yán)格的說(shuō)也算是額外的空間吧,如果再嚴(yán)格一點(diǎn),連臨時(shí)變量也不允許的話,主要有下面兩種方法。一是異或操作,因?yàn)楫惢虿僮骺梢越粨Q兩個(gè)變量而無(wú)需借助第三個(gè)變量,二是使用字符串的結(jié)束符'\0'所在的位置作為交換空間,這樣有個(gè)局限,就是只適合以'\0'結(jié)尾的字符串,對(duì)于不支持這種字符串格式的語(yǔ)言,就不能使用了。

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

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

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

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

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

*p = '\0' ; // 恢復(fù)結(jié)束符

return r ;
}

使用異或操作

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

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

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

return r ;
}

按單詞逆序

給定一個(gè)字符串,按單詞將該字符串逆序,比如給定"This is a sentence",則輸出是"sentence a is This",為了簡(jiǎn)化問題,字符串中不包含標(biāo)點(diǎn)符號(hào)。

分兩步

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

2 再整個(gè)句子逆序得到"sentence a is This"

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

代碼

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

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

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

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

return s ;
}

逆序打印

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

先求出字符串長(zhǎng)度,然后反向遍歷即可。

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

如果不想求字符串的長(zhǎng)度,可以先遍歷到末尾,然后在遍歷回來(lái),這要借助字符串的結(jié)束符'\0'。

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

while (*p)
*p++ ;

--p ; //while結(jié)束時(shí),p指向'\0',這里讓p指向最后一個(gè)字符

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

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

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

關(guān)于數(shù)組的面試題,請(qǐng)看這里

== THE END==

Happy coding!

作者:zdd
出處:http://www.cnblogs.com/graphics/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利.
posted on 2012-02-21 16:26 life02 閱讀(612) 評(píng)論(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>
            亚洲欧美日韩在线一区| 久久精品夜色噜噜亚洲aⅴ| 亚洲图片自拍偷拍| 亚洲免费一在线| 亚洲一区中文字幕在线观看| 亚洲女优在线| 久久久成人精品| 蜜臀91精品一区二区三区| 久久成人综合视频| 久久精品国产2020观看福利| 久久这里只有| 91久久亚洲| 日韩视频在线免费观看| 91久久精品国产91性色tv| 欧美国产日产韩国视频| 亚洲欧美韩国| 亚洲在线免费视频| 欲香欲色天天天综合和网| 99精品热视频| 禁断一区二区三区在线| 欧美色图五月天| 免费试看一区| 欧美自拍偷拍| 亚洲在线网站| 亚洲精品久久久久中文字幕欢迎你 | 欧美a级片网站| 亚洲精品在线观看免费| 久久青草福利网站| 欧美在线一级视频| 99精品国产福利在线观看免费| 欧美午夜一区二区三区免费大片| 久久亚洲欧洲| 欧美在线观看视频在线| 亚洲一区欧美| 亚洲综合欧美| 午夜精品国产更新| 亚洲欧美变态国产另类| 亚洲视频在线观看免费| 一本久久青青| 一本色道久久综合亚洲精品婷婷 | 国产精品日韩精品| 男女精品网站| 亚洲永久精品大片| 久久大逼视频| 亚洲欧美日韩爽爽影院| 亚洲欧美日韩国产一区二区三区| 亚洲婷婷综合久久一本伊一区| 亚洲精品综合精品自拍| 日韩视频免费在线| 一本一本a久久| 午夜精品久久久| 欧美在线黄色| 久久一区二区三区国产精品| 蜜桃伊人久久| 欧美精品一区二区在线观看 | 亚洲国产美女久久久久| 91久久在线播放| 亚洲特黄一级片| 羞羞答答国产精品www一本| 欧美一区二区性| 久久亚洲一区二区三区四区| 欧美成年人网| 欧美日韩在线高清| 国产精品自拍在线| 在线日韩中文字幕| 亚洲午夜成aⅴ人片| 久久激情婷婷| 亚洲片在线资源| 欧美一级播放| 欧美理论电影在线观看| 国产精品视屏| 亚洲国产你懂的| 亚洲自拍偷拍福利| 六月天综合网| 亚洲视频福利| 91久久在线观看| 亚洲第一在线综合网站| 久久亚洲精品中文字幕冲田杏梨| 久久高清福利视频| 亚洲免费影视第一页| 亚洲国产成人在线| 国产日韩欧美综合精品| 国产精品ⅴa在线观看h| 欧美日韩国产成人在线91| 欧美成人精品高清在线播放| 久久久久国产精品一区二区| 亚洲一线二线三线久久久| 中文在线不卡| 中国女人久久久| 亚洲综合精品| 欧美一站二站| 午夜视频在线观看一区二区| 亚洲午夜视频在线| 亚洲视频二区| 亚洲欧美国产日韩天堂区| 亚洲在线1234| 狠狠狠色丁香婷婷综合激情| 国产精品视频最多的网站| 亚洲人成网站影音先锋播放| 久久久久久久999精品视频| 一区二区三区精密机械公司 | 久久综合给合久久狠狠狠97色69| 国产精品二区三区四区| 亚洲福利精品| 美女诱惑黄网站一区| 午夜影院日韩| 欧美午夜理伦三级在线观看| 一区二区电影免费观看| 亚洲国产日韩欧美综合久久 | 亚洲在线免费视频| 久久久久久久欧美精品| 亚洲精品亚洲人成人网| 欧美黄色片免费观看| 亚洲人成艺术| 欧美高清视频在线| 免费在线亚洲欧美| 亚洲精品午夜| 亚洲精品国精品久久99热| 欧美另类一区| 一区二区日韩免费看| 亚洲精品免费电影| 欧美日韩一区二区三区在线看| 亚洲精品中文字幕在线观看| 亚洲电影第三页| 欧美精品一区在线观看| 亚洲在线中文字幕| 亚洲色诱最新| 国产亚洲欧美一区二区三区| 久久久999成人| 老司机精品福利视频| 亚洲美女性视频| 一区二区三区黄色| 国产精品日韩一区二区| 久久久久久午夜| 六月天综合网| 国产精品乱看| 99视频国产精品免费观看| av成人手机在线| 免费看的黄色欧美网站| 欧美一区二区视频在线观看2020 | 免费亚洲视频| 一本色道久久99精品综合| 一区二区三区国产在线观看| 国产主播精品| 亚洲经典自拍| 国产欧美精品在线播放| 欧美不卡视频一区发布| 欧美日韩色一区| 久久久亚洲精品一区二区三区| 免费视频一区| 欧美亚洲免费| 国产欧美 在线欧美| 91久久国产自产拍夜夜嗨| 亚洲尤物影院| 亚洲欧美制服另类日韩| 国产精品久久久久久久浪潮网站| 亚洲欧美日韩另类精品一区二区三区 | 欧美色欧美亚洲另类二区| 亚洲五月婷婷| 久久精品国产在热久久| 亚洲成色777777女色窝| 一区二区三区www| 在线观看日韩专区| 亚洲午夜一区二区| 亚洲三级电影全部在线观看高清| 亚洲影院色无极综合| 欧美精品国产精品日韩精品| 欧美伊人久久| 欧美人妖在线观看| 欧美www视频在线观看| 国产精品黄色| 亚洲麻豆国产自偷在线| 韩国精品在线观看| 亚洲自拍16p| 亚洲视频视频在线| 欧美激情视频给我| 欧美大片在线影院| 好吊一区二区三区| 久久国产福利国产秒拍| 国产欧美日韩91| 亚洲精品一区久久久久久| 欧美日韩中文字幕综合视频| 亚洲激情视频在线观看| 欧美日韩精品三区| 亚洲精品一级| 国产免费观看久久黄| 麻豆精品在线视频| 欧美激情一区二区三区蜜桃视频| 老**午夜毛片一区二区三区| 国产精品久久久99| 蜜桃精品久久久久久久免费影院| 国产一区二区激情| 久久精品国产亚洲精品| 午夜精品久久久久久久蜜桃app | 正在播放亚洲| 久久爱www.| 国产一区激情| 久久久久综合网| 欧美激情亚洲综合一区| 日韩亚洲视频|