算法題解-字符串+數(shù)組-CCI

一共三道題滥玷,兩道數(shù)組+上次剩下的一道字符串氏身。其中1、3題惑畴,有一定的難度蛋欣,需要思考。

像素翻轉(zhuǎn)

題目描述
有一副由NxN矩陣表示的圖像如贷,這里每個(gè)像素用一個(gè)int表示陷虎,請(qǐng)編寫(xiě)一個(gè)算法,在不占用額外內(nèi)存空間的情況下(即不使用緩存矩陣)杠袱,將圖像順時(shí)針旋轉(zhuǎn)90度泻红。
給定一個(gè)NxN的矩陣,和矩陣的階數(shù)N,請(qǐng)返回旋轉(zhuǎn)后的NxN矩陣,保證N小于等于500霞掺,圖像元素小于等于256。
測(cè)試樣例:
[[1,2,3],[4,5,6],[7,8,9]],3
返回:[[7,4,1],[8,5,2],[9,6,3]]
思路:
這題有兩種思路讹躯,難點(diǎn)還是在于不使用輔助空間菩彬。最容易想到的就是按層處理缠劝,每一層按照左->上,下->左骗灶,右->下惨恭,上->右的次序依次交換該行或列中的每一個(gè)元素,其中用臨時(shí)變量保存第一個(gè)用來(lái)替換的元素耙旦。時(shí)間復(fù)雜度是O(n^2)
第二個(gè)思路就很巧妙脱羡,先將第i行和第n-i-1行交換,然后經(jīng)過(guò)主對(duì)角線對(duì)稱交換免都。但是復(fù)雜度相近锉罐。

class Transform {
public:
    vector<vector<int> > transformImage(vector<vector<int> > mat, int n) {
        // write code here
        /*
        分圈考慮,從最外圈開(kāi)始
        按照左->上绕娘,下->左脓规,右->下,上->右的次序依次交換元素
        一直到最內(nèi)層
        */
        for(int i=0; i<n/2; i++) { //正在處理第幾層
            for(int j=i; j<n-1-i; j++) { //第i圈有n-i個(gè)元素
                int tmp = mat[i][j];
                mat[i][j] = mat[n-j-1][i];//左->上
                mat[n-j-1][i] = mat[n-i-1][n-j-1];//下->左
                mat[n-i-1][n-j-1] = mat[j][n-i-1];//右->下
                mat[j][n-i-1] = tmp;//上->右
            }
        }
        return mat;
    }
};

清除行列

題目描述
請(qǐng)編寫(xiě)一個(gè)算法险领,若N階方陣中某個(gè)元素為0侨舆,則將其所在的行與列清零。
給定一個(gè)N階方陣int[]mat和矩陣的階數(shù)n绢陌,請(qǐng)返回完成操作后的int[][]方陣(C++中為vector<vector><int>>)挨下,保證n小于等于300,矩陣中的元素為int范圍內(nèi)脐湾。</int></vector></int></vector>
測(cè)試樣例:
[[1,2,3],[0,1,2],[0,0,1]]
返回:[[0,0,3],[0,0,0],[0,0,0]]
思路:
這題不難臭笆,坑在于不能遇到0就直接置0,不然后面處理同行列元素后都是0沥割。要先標(biāo)記耗啦,遍歷完全部的元素后置0。

class Clearer {
public:
    vector<vector<int> > clearZero(vector<vector<int> > mat, int n) {
        // write code here
        vector<bool> col(n, false);
        vector<bool> raw(n, false);
        for(int i=0; i<n; i++) {
            for(int j=0; j<n; j++) {
                if(mat[i][j] == 0) {
                    col[i] = true;
                    raw[j] = true;
                }
            }
        }
        for(int i=0; i<n; i++) {
            for(int j=0; j<n; j++) {
                if(col[i] || raw[j])
                    mat[i][j] = 0;
            }
        }
                
        return mat;
    }
};

翻轉(zhuǎn)子串

題目描述
假定我們都知道非常高效的算法來(lái)檢查一個(gè)單詞是否為其他字符串的子串机杜。請(qǐng)將這個(gè)算法編寫(xiě)成一個(gè)函數(shù)帜讲,給定兩個(gè)字符串s1和s2,請(qǐng)編寫(xiě)代碼檢查s2是否為s1旋轉(zhuǎn)而成椒拗,要求只能調(diào)用一次檢查子串的函數(shù)似将。
給定兩個(gè)字符串s1,s2,請(qǐng)返回bool值代表s2是否由s1旋轉(zhuǎn)而成。字符串中字符為英文字母和空格蚀苛,區(qū)分大小寫(xiě)在验,字符串長(zhǎng)度小于等于1000。
測(cè)試樣例:
"Hello world","worldhello "
返回:false

"waterbottle","erbottlewat"
返回:true
思路:
這題表述的其實(shí)不太清楚堵未,一開(kāi)始沒(méi)理解腋舌。其實(shí)表達(dá)的意思就是截取字符串放到字符串的結(jié)尾,截取的部分字符順序不變渗蟹。例如原字符串是ABCD块饺,截取A部分放到BCD之后變成BCDA赞辩。判斷是不是和原字符串的各部分相同就行了。
PS:是我見(jiàn)識(shí)太少了授艰,旋轉(zhuǎn)的意思就是循環(huán)左移辨嗽。
思路很巧妙,把ABCD和自己拼接起來(lái)變成ABCDABCD淮腾,如果符合題意糟需,那么“旋轉(zhuǎn)”后的字符串一定是ABCDABCD的一個(gè)字串,這樣一來(lái)谷朝,就變成了常見(jiàn)的尋找字串問(wèn)題洲押。可以直接用STL庫(kù)中的find()方法徘禁。當(dāng)然诅诱,自己寫(xiě)的話就要復(fù)現(xiàn)KMP算法了。

class ReverseEqual {
public:
    bool checkReverseEqual(string s1, string s2) {
        // write code here
        s1 = s1 + s1;
        if(s1.find(s2) != s1.npos)
            return true;
        else 
            return false; 
    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末送朱,一起剝皮案震驚了整個(gè)濱河市娘荡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌驶沼,老刑警劉巖炮沐,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異回怜,居然都是意外死亡大年,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門玉雾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)翔试,“玉大人,你說(shuō)我怎么就攤上這事复旬】衙澹” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵驹碍,是天一觀的道長(zhǎng)壁涎。 經(jīng)常有香客問(wèn)我,道長(zhǎng)志秃,這世上最難降的妖魔是什么怔球? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮浮还,結(jié)果婚禮上竟坛,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好流码,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布又官。 她就那樣靜靜地躺著,像睡著了一般漫试。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碘赖,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天驾荣,我揣著相機(jī)與錄音,去河邊找鬼普泡。 笑死播掷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的撼班。 我是一名探鬼主播歧匈,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼砰嘁!你這毒婦竟也來(lái)了件炉?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤矮湘,失蹤者是張志新(化名)和其女友劉穎斟冕,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體缅阳,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡磕蛇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了十办。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秀撇。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖向族,靈堂內(nèi)的尸體忽然破棺而出呵燕,到底是詐尸還是另有隱情,我是刑警寧澤炸枣,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布虏等,位于F島的核電站,受9級(jí)特大地震影響适肠,放射性物質(zhì)發(fā)生泄漏霍衫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一侯养、第九天 我趴在偏房一處隱蔽的房頂上張望敦跌。 院中可真熱鬧,春花似錦、人聲如沸柠傍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惧笛。三九已至从媚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間患整,已是汗流浹背拜效。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留各谚,地道東北人紧憾。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像昌渤,于是被迫代替她去往敵國(guó)和親赴穗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 在C語(yǔ)言中,五種基本數(shù)據(jù)類型存儲(chǔ)空間長(zhǎng)度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來(lái)閱讀 3,345評(píng)論 0 2
  • 1.相關(guān)數(shù)據(jù)結(jié)構(gòu) 1.1 ArrayList 1.2 String膀息、StringBuffer和StringBuil...
    王偵閱讀 588評(píng)論 0 1
  • 1)字符串操作strcpy(p, p1) 復(fù)制字符串strncpy(p, p1, n) 復(fù)制指定長(zhǎng)度字符串strc...
    XDgbh閱讀 4,425評(píng)論 0 10
  • 一般眉、set集合【了解】 1.概述 和數(shù)學(xué)上的集合基本是一樣的,特點(diǎn):不允許有重復(fù)元素履婉,可以進(jìn)行交集煤篙,并集,差集的運(yùn)...
    墨雨love薏雪閱讀 677評(píng)論 0 0
  • 錢是好東西
    我是土妞兒閱讀 54評(píng)論 0 0