LeetCode日記2

LeetCode-5git

思路:算法

(1)最後用子字符串操做返回string。編程

    return s.substr(startpos, maxlength);數組

(2)迴文串的判斷:app

1)首先找出迴文串中間連續的重複的字符。
函數

2)再向兩邊進行判斷學習

(3)優化:優化

1)若i的位置使後面可能的迴文串的最大長度不可能超出maxlength,則直接退出循環。spa

2)i = k + 1;//此句可防止在同一個迴文串中進行屢次判斷。指針

參考:

https://leetcode.com/discuss/32204/simple-c-solution-8ms-13-lines



LeetCode-6

(1)string的操做。



LeetCode-7

(1)

to_string函數將int轉換爲string

reverse函數對string反轉

stoll函數將string轉換爲long long

(2)判斷溢出,溢出時返回0

if (tmp > INT_MAX || tmp < INT_MIN) return 0;



LeetCode-8 把string轉換爲int型,須要考慮string的全部可能

先獲得一個string,再轉換爲__int64x,再轉換爲int。

(1)去掉前綴空格。

(2)讀取符號位。

(3)去掉前綴0。

(4)讀取數字,處理溢出的狀況。 

DISCUSS中簡短的代碼學習:

int atoi(const char *str) {
	int sign = 1, base = 0, i = 0;
	while (str[i] == ' ') { i++; }
	if (str[i] == '-' || str[i] == '+') {
		sign = 1 - 2 * (str[i++] == '-');
	}
	while (str[i] >= '0' && str[i] <= '9') {
		if (base >  INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7)) {
			if (sign == 1) return INT_MAX;
			else return INT_MIN;
		}
		base = 10 * base + (str[i++] - '0');
	}
	return base * sign;
}

 (1)while去掉空格;if讀取符號;while讀取數字(不用去0,由於經過計算獲得最後的整數);判斷溢出。



(2015/10/21)

LeetCode-9 Palindrome Number :速度須要改進


LeetCode-13 Roman to Integer:從高位開始,把一個字符和它後一個字符比較,若大於等於則加上其表明的數字,若小於則減,最後一個字符直接加上。



(2015/10/22)

LeetCode-11 Container With Most Water:

畫一個矩陣,行表示左邊的垂線,列表示右邊的垂線。

矩陣的對角線,以及左下三角不用計算。(對角線上體積爲0,左下三角與右上三角對稱)

1)當左垂線的高小於右垂線時,剩下的行不用計算。

2)當有垂線的高小於左垂線時,剩下的列不用計算。

參考:

https://leetcode.com/discuss/11482/yet-another-way-to-see-what-happens-in-the-o-n-algorithm



(2015/10/23)

LeetCode-12 Integer to Roman:

羅馬數字與整數的對應關係:

M            D             C             L             X             V             I

1000        500        100          50          10            5            1

從大往小,把整數表示成羅馬數字。每次分兩種狀況:

1)插入n個相同的字母。

2)把小的數字放大的數字左邊表示減法。


LeetCode-14 Longest Common Prefix:(easy)找出vector<string> strs中string的公共最長前綴。


LeetCode-15 3Sum:(cant)

參考:

https://leetcode.com/discuss/23595/share-my-solution-around-50ms-with-explanation-and-comments

1)肯定第一個數。(忽略重複的狀況)

2)剩下兩個數的肯定,至關於LeetCode-1 TwoSum的狀況。(忽略重複的狀況)

(先肯定起點(front)和終點(rear),下標是否越界經過判斷front < rear便可)



(2015/10/24)

LeetCode-16 3Sum Closest:(cant)

要學會觸類旁通,其實和LeetCode-15是同樣的,不一樣之處只是下標移動的條件不一樣。

參考:

https://leetcode.com/discuss/42432/c-solution-o-n-2-using-sort


LeetCode-17 Letter Combinations of a Phone Number:(easy)

1)創建一個map數組,表示鍵盤上每個數字對應的可能的字母。

2)創建兩個數組,一個表示 digits字符串中字符所對應的數字,這個數字在 map中的下標;另外一個數組表示對每個map中的string遍歷的下標。

3)能夠經過計算一共有多少種可能的string來控制循環的次數。

class Solution {
public:
    vector<string> letterCombinations(string digits) {
        vector<string> map = \
        {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        vector<int> index, scan;
        vector<string> ans;
        
        if(digits.size() == 0) return ans;
        for(string::size_type i = 0; i < digits.size(); i++){
            int tmp = digits[i] - '0';
            if(tmp >= 2 && tmp <= 9){
                index.push_back(tmp - 2);
                scan.push_back(0);
            }
            else return ans;
        }
        
        int nums = 1;
        for(vector<int>::size_type i = 0; i < index.size(); i++)
            nums *= map[index[i]].size();

        for(int i = 0; i < nums; i++){
            string tmp;
            for(vector<int>::size_type i = 0; i < index.size(); i++)
                tmp += map[index[i]][scan[i]];
            ans.push_back(tmp);
            scan[scan.size() - 1]++;
            for(vector<int>::size_type i = index.size() - 1; i > 0; i--){
                if(scan[i] >= map[index[i]].size()) {
                    scan[i] = 0;
                    scan[i - 1]++;
                }
                else break;
            }
        }
        return ans;
    }
};


(2015/10/27)

LeetCode-17 4Sum:(cant)

用到的C++知識:

1)unordered_map:用哈希函數組織的無序、關鍵字不可重複的map。c.count(k),返回關鍵字等於k的元素數量。

2)pair類型、make_pair操做

3)vector容器的back操做,返回尾元素的引用。

C++中一個易錯的地方,很差的編程習慣?

1)for(vector<int>::size_type i = 0; i < nums.size(); i++),中間的條件判斷語句最好不要寫i < nums.size() - (一個數)。可能會溢出。

算法參考:https://leetcode.com/discuss/12358/my-c-solution-using-hashtable

1)根據nums的大小判斷是否直接返回。

2)排序。

3)創建哈希表,關鍵字是兩個數的和。

4)尋找另外兩個數,(跳太重複的數),(獲得一個answer時判斷是否等於上一個answer(經過容器的back操做)(產生重複的緣由:兩組下標不一樣,但值徹底相同的兩組數,會產生相同的關鍵字))。


LeetCode-19 Remove Nth Node From End of List:(easy)

1)計算節點總數,算出要刪除的是第幾個節點。

2)分狀況:1)刪除的是頭結點。2)刪除的是中間的節點、尾節點。


LeetCode-20 Valid Parentheses:(easy)堆棧stack。

LeetCode-21 Merge Two Sorted Lists : (easy)


正確的鏈表構造方式:分別用兩個指針指向下面兩個須要比較的節點,用一個指針指向新鏈表的最後一個節點。


LeetCode-26 Remove Duplicates from Sorted Array:(easy)

兩個下標:一個表示當前的最後一個非重複元素的下標,另外一個掃描容器(掃描時跳太重複的元素)。



(2015/10/28)

LeetCode-27 Remove Element:(easy)

LeetCode-28 Implement strStr():(easy)

注意:

1)要充分考慮到何時是不可能(或已不可能)找到needle。

2)正確找到needle的判斷條件。

相關文章
相關標籤/搜索