算法練習(xí)四

7. 反轉(zhuǎn)整數(shù)

給定一個 32 位有符號整數(shù),將整數(shù)中的數(shù)字進行反轉(zhuǎn)。

示例 1:

輸入: 123
輸出: 321
示例 2:

輸入: -123
輸出: -321
示例 3:

輸入: 120
輸出: 21
注意:

假設(shè)我們的環(huán)境只能存儲 32 位有符號整數(shù),其數(shù)值范圍是 [?231, 231 ? 1]。根據(jù)這個假設(shè),如果反轉(zhuǎn)后的整數(shù)溢出,則返回 0。

常規(guī)思路解題,求余數(shù),需要注意的是溢出判斷。

class Solution {
public:
    int reverse(int x) {
        int t = 0;
        while (x != 0)
        {
            //溢出判斷
            if (t >INT_MAX / 10 || t <(INT_MIN) / 10)
                return 0;
            t= t * 10 + x % 10;
            x /= 10;
        }
 
        return t;
    }
};

8. 字符串轉(zhuǎn)整數(shù) (atoi)

實現(xiàn) atoi,將字符串轉(zhuǎn)為整數(shù)。

在找到第一個非空字符之前,需要移除掉字符串中的空格字符。如果第一個非空字符是正號或負(fù)號,選取該符號,并將其與后面盡可能多的連續(xù)的數(shù)字組合起來,這部分字符即為整數(shù)的值。如果第一個非空字符是數(shù)字,則直接將其與之后連續(xù)的數(shù)字字符組合起來,形成整數(shù)。

字符串可以在形成整數(shù)的字符后面包括多余的字符,這些字符可以被忽略,它們對于函數(shù)沒有影響。

當(dāng)字符串中的第一個非空字符序列不是個有效的整數(shù);或字符串為空;或字符串僅包含空白字符時,則不進行轉(zhuǎn)換。

若函數(shù)不能執(zhí)行有效的轉(zhuǎn)換,返回 0。

說明:

假設(shè)我們的環(huán)境只能存儲 32 位有符號整數(shù),其數(shù)值范圍是 [?231, 231 ? 1]。如果數(shù)值超過可表示的范圍,則返回 INT_MAX (231 ? 1) 或 INT_MIN (?231) 。

示例 1:

輸入: "42"
輸出: 42
示例 2:

輸入: " -42"
輸出: -42
解釋: 第一個非空白字符為 '-', 它是一個負(fù)號。
我們盡可能將負(fù)號與后面所有連續(xù)出現(xiàn)的數(shù)字組合起來,最后得到 -42 。
示例 3:

輸入: "4193 with words"
輸出: 4193
解釋: 轉(zhuǎn)換截止于數(shù)字 '3' ,因為它的下一個字符不為數(shù)字。
示例 4:

輸入: "words and 987"
輸出: 0
解釋: 第一個非空字符是 'w', 但它不是數(shù)字或正、負(fù)號。
因此無法執(zhí)行有效的轉(zhuǎn)換。
示例 5:

輸入: "-91283472332"
輸出: -2147483648
解釋: 數(shù)字 "-91283472332" 超過 32 位有符號整數(shù)范圍。
因此返回 INT_MIN (?231) 。

其實就是atoi的函數(shù)實現(xiàn),依然較為簡單,依次判斷所有條件即可??崭瘢?fù)號,溢出,是否為數(shù)字

class Solution {
public:
    int myAtoi(string str) {
        if (str.empty()) {
            return 0;
        }
        
        int sign = 1, base = 0, i = 0,n = str.size();
        while (i < n && str[i] == ' ') {
            I++;
        }
        
        if (str[i] == '+' || str[i] == '-') {
            sign = (str[i] == '+') ? 1: -1;
            I++;
        }
        
        while (i <n && str[i] >= '0' && str[i] <= '9') {
            if (base > INT_MAX/10 || (base == INT_MAX/10 && str[i] - '0' >7)) {
                return (sign ==1) ? INT_MAX : INT_MIN;
            }
            base = 10 * base + (str[i] - '0');
            I++;
        }
        return sign *base;
        
    }
};

62. 不同路徑

一個機器人位于一個 *m x n *網(wǎng)格的左上角 (起始點在下圖中標(biāo)記為“Start” )。

機器人每次只能向下或者向右移動一步。機器人試圖達到網(wǎng)格的右下角(在下圖中標(biāo)記為“Finish”)。

問總共有多少條不同的路徑?

<small style="box-sizing: border-box; font-size: 12px;">例如,上圖是一個7 x 3 的網(wǎng)格。有多少可能的路徑?</small>

說明:m 和 *n *的值均不超過 100。

示例 1:

輸入: m = 3, n = 2
輸出: 3
解釋:
從左上角開始,總共有 3 條路徑可以到達右下角。

  1. 向右 -> 向右 -> 向下
  2. 向右 -> 向下 -> 向右
  3. 向下 -> 向右 -> 向右

示例 2:

輸入: m = 7, n = 3
輸出: 28

除了DFS和BFS搜索算法,這題其實典型的動態(tài)規(guī)劃。我們可以假設(shè)dp[i][j]的值就是第i行,j列的路徑數(shù),很明顯i = 0.的所有值都是1,j = 0的所有值都為1,只有一條路徑。而除此之外dp[i][j] = dp[i-1][j] + dp[i][j-1];時間復(fù)雜度O(nm),空間復(fù)雜度O(nm)

class Solution {
public:
    int uniquePaths(int m, int n) {
        int dp[m][n];
        for (int i = 0; i<m; i++) {
            for (int j = 0; j <n; j++) {
                if (i == 0 || j == 0) {
                    //只有一種
                    dp[i][j] = 1;
                }
                else{
                    dp[i][j] = dp[i-1][j] + dp[i][j-1];
                }
            }
        }
        
        return dp[m-1][n-1];
    }
};

19. 刪除鏈表的倒數(shù)第N個節(jié)點

給定一個鏈表,刪除鏈表的倒數(shù)第 n 個節(jié)點,并且返回鏈表的頭結(jié)點。

示例:

給定一個鏈表: 1->2->3->4->5, 和 n = 2.

當(dāng)刪除了倒數(shù)第二個節(jié)點后,鏈表變?yōu)?1->2->3->5.
說明:

給定的 n 保證是有效的。

進階:

你能嘗試使用一趟掃描實現(xiàn)嗎?

思路一趟掃描,使用雙指針,可以指定兩個相差n的節(jié)點指針遍歷鏈表,這樣前面的指針遍歷到鏈表尾部的時候,后面的指針正好在倒數(shù)第n+1個節(jié)點的位置,刪除節(jié)點只需要改變next指向即可。代碼并不復(fù)雜。

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        struct ListNode *headCache = new ListNode(0);
        headCache->next = head;
        ListNode *end = headCache;
        for (int i = 0; i <n; i++) {
            head = head->next;
        }
        
        while (head != NULL) {
            head = head->next;
            end = end->next;
        }
        //刪除結(jié)點
        end->next = end->next->next;
        
        return headCache->next;
    }
    
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 我認(rèn)為的編程能力: 基礎(chǔ)知識:數(shù)據(jù)庫、操作系統(tǒng)、網(wǎng)絡(luò)原理等; 編碼能力:軟件架構(gòu)(MVVM、MVP)、設(shè)計模...
    落影l(fā)oyinglin閱讀 1,068評論 2 7
  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 4,081評論 0 2
  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,613評論 0 13
  • 想象一下十年以后,我們的生活狀態(tài)、如果安安穩(wěn)穩(wěn)的掙著每個月5000塊錢,然后干到10年以后,你覺得你會成為一個富人...
    鄭惠彭閱讀 287評論 0 3
  • 從小到大,讀書是我一大愛好!敬愛的老媽常跟我親愛的女兒說“陽陽,你知道你媽媽小時候最愛讀書,零花錢都花費到買...
    自由靈魚閱讀 626評論 0 0

友情鏈接更多精彩內(nèi)容