第一部分 簡單算法題
-
整數反轉
題目:給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
解題思路:通過對x數據求餘數,將最後一位數字輸出到第一位,難點在於考慮數字溢出情況。
代碼:class Solution { public: int reverse(int x) { int rev = 0; while (x != 0) { int pop = x % 10; x /= 10; if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0; if (rev < INT_MIN/10 || (rev == INT_MIN / 10 && pop < -8)) return 0; rev = rev * 10 + pop; } return rev; } };
-
兩數之和
題目:給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。
代碼:class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> result; for(int i = 0;i < nums.size();i++) { for(int j = i + 1;j < nums.size();j++) { if(nums[i] + nums[j] == target) { result.push_back(i); result.push_back(j); } } } return result; } };
-
刪除排序數組中的重複項
題目:給定一個排序數組,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後數組的新長度。
解題思路:使用快慢指針。class Solution { public: int removeDuplicates(vector<int>& nums) { int i = 0; if(nums.size()==0)return 0; for (int j = 1; j < nums.size(); j++) { if (nums[j] != nums[i]) { i++; nums[i] = nums[j]; } } return i+1; } };
-
加一
題目:給定一個由整數組成的非空數組所表示的非負整數,在該數的基礎上加一。最高位數字存放在數組的首位, 數組中每個元素只存儲單個數字。你可以假設除了整數 0 之外,這個整數不會以零開頭。
代碼:class Solution { public: vector<int> plusOne(vector<int>& digits) { int len=digits.size(); for(int i=len-1;i>=0;i--) { if(digits[i]!=9) { digits[i]++; return digits; }else { digits[i]=0; continue; } } digits.insert(digits.begin(),1); return digits; } };
第二部分 中等算法題
- 整數反轉
題目: 給定一個 n × n 的二維矩陣表示一個圖像。將圖像順時針旋轉 90 度。
解題思路:先對矩陣進行轉置,然後水平翻轉。class Solution { public: void rotate(vector<vector<int>>& matrix) { int n=matrix.size(); for (int i = 0; i < n; i++) { for (int j = i; j < n; j++) { int tmp = matrix[j][i]; matrix[j][i] = matrix[i][j]; matrix[i][j] = tmp; } } for(int i=0;i<n;i++) { for(int j=0;j<n/2;j++) { int tmp=matrix[i][j]; matrix[i][j]=matrix[i][n-j-1]; matrix[i][n-j-1]=tmp; } } } };