常见易错算法题
1 快排
void QuickSort(vector<int>& nums, int start, int end){
//记录基准的的值
int index = nums[start];
int i = start;
int j = end;
while(i < j){
while(i < j && nums[j] >= index){
j--;
}
if(i < j){
swap(nums[i], nums[j]);
}
while(i > j && nums[i] <= index){
i++;
}
if(i < j){
swap(nums[i], nums[j]);
}
}
if(i - 1 > start){
QuickSort(nums, start, i - 1);
}
if(end > i+1){
QuickSort(nums, i + 1, end);
}
}
2 链表逆转
3 KMP
//计算模板子串的next数组
vector<int> GetNext(string& s){
int len = (int)s.size();
vector<int> next;
if(len == 0){
return next;
}
//next[0] = -1;
next.emplace_back(-1);
int i = 1;
//定义一个j用来递归的找下一个比对的点
int j = 0;
while(i < len){
//j=0了,就为0;s[next[j]]需要与i-1的位置比较
if(next[j] == -1 || s[next[j]] == s[i-1]){
next.emplace_back(next[j] + 1);
j = i; //j移到i位置
i++; //i移到下一位
}else{ //不相等,就递归的找下一个next比较
j = next[j];
}
}
return next;
}
//在str中找pat的子串
int strStr(string str, string pat) {
vector<int> next = GetNext(pat);
int i = 0;
int j = 0;
while(i < (int)str.size() && j < (int)pat.size()){
if(str[i] == pat[j]){
i++;
j++;
} else {
if(next[j] == -1) {//j=0了,已经找到最开头了,直接从i++重新开始比
i++;
} else {
j = next[j]; //i和next[j]位置比
}
}
}
return j == (int)needle.size() ? i - j : -1;
}
4 求两个链表的公共结点
5 输入输出
5.1 输入二维数组
/*
2 3
1 2 3
4 5 6
*/
int n, m;
while (cin >> n >> m)
{
vector<vector<int>> data(n, vector<int>(m));
int sum = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)cin >> data[i][j];
5.2 字符串
/*
1.不带空格
input: sss aaa
output: sss
*/
string input1;
cin >> input1;
/*
2.带空格
input: sss aaa
output: sss aaa
*/
string input;
getline(cin, input);
/*
3.多行
input:
sss aa
sss
bbb
*/
string input;
vector<string> text;
while (getline(cin, input))
{
text.push_back(input);
if (cin.get() == '\n')
{
break;
}
}
/*
以空格分割
input: sss aaa bbb
output: vector<string> res = {sss,aaa,bbb}
*/
string tempStr;
vector<string> Array;
while (cin >> tempStr)
{
Array.push_back(tempStr);
if (cin.get() == '\n') break; //此处语句只能放在录入之后,否则会少收录一个
}
/*
以,分割字符串
sss,aaa,bbb
-> sss aaa bbb
*/
#include<sstream>
string s;
getline(cin, s);
vector<string> res;
stringstream ss(s);
string s1;
while(getline(ss, s1, ',')){
res.push_back(s1);
}
参考
[1] C++输入输出-OJ