1.电话字符组合
#include <iostream>
#include <vector>
using namespace std;
string letterMap[10] = { "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };
void CombineStr(const string& digits, int pos, const string str,vector<string>& ret)
{
if (pos == digits.size()) //pos个字符为一组,pos为str的个数
{
ret.push_back(str); //压入str
return;
}
string letters = letterMap[digits[pos] - '0']; // 获取数字对应的字符数组
for (size_t i = 0; i < letters.size(); ++i) // 循环让letters组的每个字符匹配
{
CombineStr(digits, pos + 1, str + letters[i], ret);
}
}
vector<string> letterCombinations(string digits)
{
vector<string> ret;
if (digits.empty())
return ret;
int pos = 0;
string str;
CombineStr(digits, pos, str, ret);
return ret;
}
int main()
{
vector<string> ret = letterCombinations("23");
for (auto x : ret){
cout << x.c_str() << endl;
}
return 0;
}
2.杨辉三角
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> gentater(int rowNum)
{
vector<vector<int>> vv;
vv.resize(rowNum);
//初始化
for (int i = 1; i <= rowNum; i++){
vv[i-1].resize(i, 0);
vv[i-1][0] = vv[i-1][i-1] = 1;
}
if (rowNum <= 2){
return vv;
}
for (int i = 2; i < rowNum; i++){ //从第三行开始加
for (int j = 1; j < vv[i].size() - 1; j++){
vv[i][j] = vv[i - 1][j - 1] + vv[i - 1][j];
}
}
return vv;
}
int main()
{
vector<vector<int>> vv = gentater(2);
for (int i = 0; i < vv.size(); i++)
{
for (int j = 0; j < vv[i].size(); j++)
{
cout << vv[i][j] << " ";
}
cout << endl;
}
return 0;
}
3.删除数组中相同的元素
#include <iostream>
#include <vector>
using namespace std;
int removeDuplicates(vector<int>& nums) {
if (nums.empty())
return 0;
int pos = 1;
for (int i = 0; i < nums.size(); i++){
for (int j = i + 1; j < nums.size(); j++){
if (nums[i] != nums[j]){
nums[pos++] = nums[j];
i = j-1;
break;
}
}
}
return pos;
}
int main()
{
vector<int> nums;
nums.push_back(1);
nums.push_back(2);
nums.push_back(3);
int ret = removeDuplicates(nums);
for (int i = 0; i < ret; i++){
cout << nums[i] << endl;
}
return 0;
}
4.找数组中两个不同的元素
#include <iostream>
#include <vector>
using namespace std;
vector<int> singleNumber(vector<int>& nums) {
vector<int> v;
int result = nums[0];
for (int i = 1; i<nums.size(); i++){
result ^= nums[i]; //异或结果
}
int num1 = 0, num2 = 0, pos = 0;
while (((result >> pos) & 1) == 0) //注意优先级
pos++;
for (int i = 0; i<nums.size(); i++){
if (((nums[i] >> pos) & 1) == 1)
{
num1 ^= nums[i];
}
else
num2 ^= nums[i];
}
v.push_back(num1);
v.push_back(num2);
return v;
}
int main()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(1);
v.push_back(3);
v.push_back(5);
v.push_back(2);
v = singleNumber(v);
for (auto x : v){
cout << x << endl;
}
return 0;
}
5.数组中出现数字超过一半的数字
#include <iostream>
#include <vector>
using namespace std;
void QuickSort(vector<int>& v, int start, int end)
{
if (start >= end){
return;
}
int key = v[start];
int i = start;
int j = end - 1;
while (i != j)
{
while (i < j&&v[j] >= key){
j--;
}
while (i < j&&v[i] <= key){
i++;
}
swap(v[i], v[j]);
}
swap(v[i], v[start]);
QuickSort(v, start, i);
QuickSort(v, i + 1, end);
}
int Find(vector<int>& v)
{
QuickSort(v, 0, v.size()); //先排序
int mid = v.size() / 2; //再取中
return v[mid];
}
int main()
{
vector<int> v;
v.push_back(2);
v.push_back(3);
v.push_back(2);
v.push_back(4);
v.push_back(2);
v.push_back(5);
v.push_back(2);
cout << Find(v) << endl;
return 0;
}
6.数组中的最大子序列
#include <iostream>
#include <vector>
using namespace std;
//状态转移方程 : sum[i] = max{sum[i-1]+a[i],a[i]}
int FindGreatestSumOfSubArray(vector<int> array) {
int cursum = array[0];
int maxsum = array[0];
for (int i = 1; i<array.size(); i++){
cursum += array[i];
if (cursum < array[i]){ //若当前子序列之和小于当前元素
cursum = array[i]; //则更新子序列
}
if (cursum > maxsum)
{
maxsum = cursum;
}
}
return maxsum;
}
int main()
{
vector<int> array;
array.push_back(1);
array.push_back(-2);
array.push_back(3);
array.push_back(10);
array.push_back(-4);
array.push_back(7);
array.push_back(2);
array.push_back(-5);
cout << FindGreatestSumOfSubArray(array) << endl;
}