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的判斷條件。