【C++】速通涉及 “vector” 的经典OJ编程题
一. 杨辉三角
本题LeetCode链接:
解题思路:
代码实现:
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> arr(numRows);
for(int i = 0; i < numRows; i++)
{
//arr[i].resize(i + 1, 1);//将开辟的空间全初始化为1
arr[i].resize(i + 1);
arr[i][0] = arr[i][i] = 1;
}
//第一、二行的元素都是1,从第3行,第2列开始循环
for(int i = 2; i < numRows; i++)
{
for(int j = 1; j < i; j++)
{
arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
}
}
return arr;
}
};
二. 删除有序数组中的重复项
本题LeetCode链接:
解题思路:
代码实现:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int index = 1;
for(int i = 0; i < nums.size() - 1; i++)//注意下面的i + 1越界情况
{
if(nums[i] != nums[i + 1])
{
nums[index] = nums[i + 1];
index++;
}
}
//由于一旦发生交换后index就会++;所以此时index的大小就为最终长度
return index;
}
};
【C/C++】按位运算符使用规制
三. 只出现一次的数字
本题LeetCode链接:
解题思路:
代码实现:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int num = 0;
for(auto ch : nums)
{
num ^= ch;
}
return num;
}
};
四. 只出现一次的数字 III
本题LeetCode链接:
解题思路:
关键声明:
s = 101100
~s = 010011
(~s)+1 = 010100 // 根据补码的定义,这就是 -s 效果:s 的最低 1 左侧取反,右侧不变
s & -s = 000100 // lowbit
作者:灵茶山艾府
链接:https://leetcode.cn/problems/single-number-iii/solutions/2484352/tu-jie-yi-zhang-tu-miao-dong-zhuan-huan-np9d2/
来源:力扣(LeetCode)
代码实现:
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
size_t sum = 0;
for(auto ch : nums)
{
sum ^= ch;
}
//只保留一个二进制数最低位的1,其他位均为0;
size_t lowbit = sum & -sum;//此处要用size_t,解决溢出情况
int type1 = 0,type2 = 0;//此处不可以用size_t,与vector<int>不匹配
for(auto ch : nums)
{
if(lowbit & ch)
{
type1 ^= ch;
}
else
{
type2 ^= ch;
}
}
return {type1, type2};
//vector<int> ans(2,0);
//for(auto ch : nums)
//{
//ans[(ch & lowbit) == 0] ^= ch;
//}
//return ans;
}
};