目录
1、只出现一次的数字
class Solution {
public:
int singleNumber(vector<int>& nums) {
int sz = nums.size();
int a = nums[0];
for(int i = 1;i <sz;i++)
{
a = a ^ nums[i];
}
return a;
}
};
2、杨辉三角
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> v(numRows);//开辟numRows个子数组
for(int i = 0;i<numRows;i++)//外层for负责行的变化
{
v[i].resize(i + 1); //第i行就给第i个子数组开辟i+1个空间,多余空间用于存放'\0'
v[i][0] = v[i][i] = 1;//每个数组的首尾有效元素均为1
for(int j = 1;j<i;j++)//内层for负责每一行的具体变化,i=2时才会有内部数据相加
{
v[i][j] = v[i-1][j] + v[i-1][j-1];//v[i-1]调用上一个数组中的v[j]和v[j-1]位置的数得到v[i]中的[j]位置的值
}
}
return v;//返回填充好的vector
}
};
3、删除有序数组中的重复项
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n = nums.size();
if (n == 0) {
return 0;
}
int fast = 1, slow = 1;//从第二个字符开始比较,slow记录单独出现的元素个数
while (fast < n)
{
if (nums[fast] != nums[fast - 1])
{
nums[slow] = nums[fast];
++slow;//每找到一个新发现的数就将该数赋值给slow,同时slow++
}
++fast;//跳过相同的数据
}
return slow;
}
};
4、只出现一次的数字 II
class Solution {
public:
int singleNumber(vector<int>& nums) {
int sz =nums.size();
vector<int>::iterator it = nums.begin();
while(it!=nums.end())//双指针,左指针不动右指针负责遍历计数
{
int a = 0;
for(int i = 0;i < sz;i++)
{
if(*it == nums[i])//满足三次的数不是我们要的
++a;
}
if(a!=3)
return *it;
++it;
}
return 0;
}
};
5、只出现一次的数字 III
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int xorsum = 0;
for (int num: nums)
{
xorsum ^= num;//xorsum = 单独数1 ^ 单独数2,其余的全部抵消
}
// 防止溢出?
int lsb = (xorsum == INT_MIN ? xorsum : xorsum & (-xorsum));
int type1 = 0, type2 = 0;
for (int num: nums)
{
if (num & lsb)
{
type1 ^= num;
}
else
{
type2 ^= num;
}
}
return {type1, type2};//C++11多参数类型隐式类型转换
}
};
6、数组中出现次数超过一半的数字
#include <iterator>
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型vector
* @return int整型
*/
int MoreThanHalfNum_Solution(vector<int>& numbers) {
int sz = numbers.size();
vector<int>::iterator it = numbers.begin();
while(it != numbers.end())
{
int sum = 0;//每轮将标记位重置
for(int i = 0;i < sz; i++)
{
if((*it) == numbers[i])
{
++sum;
}
}
if(sum > sz / 2)
{
return *it;
}
++it;//最后移动迭代器
}
return 0;
}
};
7、电话号码的字母组合
class Solution {
public:
string tmp;//字符串尾插
vector<string> res;//将尾插好的字符串成组尾插给res
vector<string> board={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
void DFS(int pos,string digits)//深度优先遍历
{
if(pos==digits.size())//当digits的每个有效字符都递归并尾插后返回
{
res.push_back(tmp);
return;
}
int num=digits[pos]-'0';
for(int i=0;i<board[num].size();i++)
{
tmp.push_back(board[num][i]);
DFS(pos+1,digits);
tmp.pop_back();//尾删,只删除一个
}
}
vector<string> letterCombinations(string digits)
{
if(digits.size()==0)
{
return res;
}
DFS(0,digits);
return res;
}
};
~over~