一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

微軟面試題——反轉(zhuǎn)字符串

 maomao 2006-11-04

微軟面試題——反轉(zhuǎn)字符串

Posted on 2005-07-19 16:04 k_eckel 閱讀(3541) 評(píng)論(20)  編輯 收藏

k_eckelhttp://www./blog/k_eckel & http://k-eckel.cnblogs.com

這是網(wǎng)絡(luò)流傳的Microsoft的面試題目之一:“編寫反轉(zhuǎn)字符串的程序,要求優(yōu)化速度、優(yōu)化空間”。因?yàn)樽罱恢焙芏嚓P(guān)注算法方面的實(shí)踐和研究,因此對(duì)這個(gè)問題進(jìn)行了一些思考,給出了5種實(shí)現(xiàn)方法(有兩種解法相關(guān)性比較大)。

解法一:第一次看到這題目,想到最簡(jiǎn)單、最直覺的解法就是:遍歷字符串,將第一個(gè)字符和最后一個(gè)交換,第二個(gè)和倒數(shù)第二個(gè)交換,依次循環(huán),即可,于是有了第一個(gè)解法:

char* strrev1(const char* str)

{

       int len = strlen(str);

       char* tmp = new char[len + 1];

       strcpy(tmp,str);

 

       for (int i = 0; i < len/2; ++i)

       {

              char c = tmp[i];

        tmp[i] = tmp[len – i - 1];

        tmp[len – i - 1] = c;

       }

 

       return tmp;

}

這里是通過數(shù)組的下標(biāo)方式訪問字符串的字符,實(shí)際上用指針直接操作即可。解法二正是基于此,實(shí)現(xiàn)代碼為:

char* strrev2(const char* str)

{

       char* tmp = new char[strlen(str) + 1];

       strcpy(tmp,str);

       char* ret = tmp;

 

       char* p = tmp + strlen(str) - 1;

 

       while (p > tmp)

       {

              char t = *tmp;

              *tmp = *p;

              *p = t;

 

              --p;

              ++tmp;

       }

 

       return ret;

}

顯然上面的兩個(gè)解法中沒有考慮時(shí)間和空間的優(yōu)化,一個(gè)典型的優(yōu)化策略就是兩個(gè)字符交換的算法優(yōu)化,我們可以完全不使用任何外部變量即完成兩個(gè)字符(或者整數(shù))的交換,這也是一個(gè)很經(jīng)典的面試題目。特別是一些嵌入式硬件相關(guān)編程中經(jīng)常要考慮寄存器的使用,因此經(jīng)常有不使用任何第三個(gè)寄存器即完成兩個(gè)寄存器數(shù)據(jù)的交換的題目。一般有兩個(gè)解法,對(duì)應(yīng)這里的解法三和解法四。

解法三的實(shí)現(xiàn)代碼為:

char* strrev3(const char* str)

{

       char* tmp = new char[strlen(str) + 1];

       strcpy(tmp,str);

       char* ret = tmp;

 

       char* p = tmp + strlen(str) - 1;

 

       while (p > tmp)

       {

              *p ^= *tmp;

              *tmp ^= *p;             

              *p ^= *tmp;

 

              --p;

              ++tmp;

       }

 

       return ret;

}

解法四的實(shí)現(xiàn)代碼為:

char* strrev4(const char* str)

{

       char* tmp = new char[strlen(str) + 1];

       strcpy(tmp,str);

       char* ret = tmp;

 

       char* p = tmp + strlen(str) - 1;

 

       while (p > tmp)

       {

              *p = *p + *tmp;

              *tmp = *p - *tmp;

              *p = *p - *tmp;

 

              --p;

              ++tmp;

       }

 

       return ret;

}

實(shí)際上我們還可以通過遞歸的思想來解決這個(gè)問題,思想很簡(jiǎn)單:每次交換首尾兩個(gè)字符,中間部分則又變?yōu)楹驮瓉碜址瑯拥膯栴},因此可以通過遞歸的思想來解決這個(gè)問題,對(duì)應(yīng)解法五的實(shí)現(xiàn)代碼為:

char* strrev5(/*const */char* str,int len)

{

       if (len <= 1)

              return str;

 

       char t = *str;

       *str = *(str + len -1);

       *(str + len -1) = t;

 

       return (strrev5(str + 1,len - 2) - 1);

}

以下給出一個(gè)測(cè)試程序

int main(int argc,char* argv[])

{

       char* str = "hello";

       P(str);

 

       char* str2 = strrev1(str);

       P(str2);

 

       char* str3 = strrev2(str2);

       P(str3);

 

       char* str4 = strrev3(str3);

       P(str4);

 

       char* str5 = strrev4(str4);

       P(str5);

 

       char* str6 = strrev5(str5,strlen(str5));

       P(str6);

      

       return 0;

}

  你就可以看到字符串"hello""olleh"交替輸出了。

  說明:1)這里解法中沒有認(rèn)真考慮輸入字符串的合法性和特殊長(zhǎng)度(如NULL、一個(gè)字符等)字符串的處理;2)前4個(gè)算法不改變輸入字符串的值,解法五修改了輸入字符串。

Feedback

# re: 微軟面試題——反轉(zhuǎn)字符串

2005-07-20 20:53 by goodluck
解法四還可以更快一點(diǎn),因?yàn)槟闱罅藘纱蝧trlen(str)。

# re: 微軟面試題——反轉(zhuǎn)字符串

2005-07-21 09:26 by k_eckel
你說的對(duì),strlen是很耗時(shí)間的,:)

# re: 微軟面試題——反轉(zhuǎn)字符串

2005-07-26 13:58 by Alpha
是不是可以考慮用堆棧呢


pop到另外的數(shù)組然后交換字符串指針

時(shí)間上肯定快

空間..............

# re: 微軟面試題——反轉(zhuǎn)字符串

2005-07-28 12:29 by dirtysalt
似乎調(diào)用遞歸很不劃算,能用循環(huán)為什么不用循環(huán)???
strlen()函數(shù)本身就遍歷了一遍,為什么輸入字符串時(shí)就計(jì)算好長(zhǎng)度
然后用長(zhǎng)度作為參數(shù)傳入?
可能還有好解法只有微軟的人能想出來了,看來我進(jìn)微軟有問題。

# re: 微軟面試題——反轉(zhuǎn)字符串

2005-07-28 15:17 by k_eckel
是的,這里只是給出幾種不同的想法實(shí)現(xiàn)。
BTW:用遞歸實(shí)現(xiàn)好像是有一個(gè)同學(xué)曾經(jīng)問過這個(gè)問題,so。。。。。

# re: 微軟面試題——反轉(zhuǎn)字符串

2005-11-04 11:32 by 郭永平
實(shí)際上還可以這樣:這樣,時(shí)間復(fù)雜度為O(N),空間復(fù)雜度為O(0):
#include "stdio.h"
#include "string.h"
void strrev6(char* str)
{
    char *p1, *p2;
    bool bOdd = false;
    p1 = p2 = str;

    /* Find the middle element. */
    while(*p2 != ‘\0‘)
    {
        p2++;
        if (*p2 == ‘\0‘)
        {
            bOdd = true;
            break;
        }
        p2++;
        p1++;
    }

    /* Prepare to swap. */
    if (bOdd)
    {
        p2 = p1 + 1;
        p1--;
    }
    else
    {
        p2 = p1;
   p1--;
    }
    /* Begin to swap. */
    while(*p2 != ‘\0‘)
    {
*p1 ^= *p2;
*p2 ^= *p1;
*p1 ^= *p2;
        p1--;
        p2++;
    }
}

int main(void)
{
int i = 0, iLen;
char *tmp = NULL;
char str[] = "123456";
iLen = strlen(str);
strrev6(str);
tmp = str;
for (; *tmp != ‘\0‘; )
{
printf("%c", *tmp++);
}
return 0;
}

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    国产成人精品一区二区在线看| 免费黄片视频美女一区| 国产精品午夜一区二区三区 | 国产一区日韩二区欧美| 高清不卡视频在线观看| 久久人妻人人澡人人妻| 中文字幕亚洲人妻在线视频| 国产免费操美女逼视频| 韩国日本欧美国产三级| 日韩精品在线观看完整版| 国产视频一区二区三区四区| 日韩高清一区二区三区四区| 日本深夜福利视频在线| 亚洲黄香蕉视频免费看| 老司机精品视频在线免费看| 深夜福利亚洲高清性感| 国产一区二区三区四区免费| 正在播放玩弄漂亮少妇高潮 | 在线免费国产一区二区三区| 成年人黄片大全在线观看| 国产精品一区二区传媒蜜臀| 国产无摭挡又爽又色又刺激| 最近最新中文字幕免费| 99久久精品免费精品国产| 精品久久少妇激情视频| 日系韩系还是欧美久久| 亚洲综合天堂一二三区| 午夜资源在线观看免费高清| 国产美女精品人人做人人爽| 欧美黑人暴力猛交精品| 99热在线播放免费观看| 91精品国产综合久久福利| 亚洲男女性生活免费视频| av在线免费观看在线免费观看 | 国产av乱了乱了一区二区三区| 人妻久久一区二区三区精品99| 久久大香蕉精品在线观看| 色老汉在线视频免费亚欧| 美国黑人一级黄色大片| 亚洲精品成人综合色在线| 91天堂素人精品系列全集|