第一部分 简单算法题
-
整数反转
题目:给出一个 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; } } } };