环境设置
DEVC++
编程注意
1.int负数变为正数要注意溢出
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1]
所以题目中虽然给的参数是int类型,但是有步骤要把负整数变为正整数时要注意可能会溢出。这时候如果是非递归要定义一个long的变量,如果是要用递归的话可以再写一个接收long参数的函数并在这个函数进行递归。
2.使用vector的erase方法时要注意索引可能要改变,如下面这题
参考:https://blog.csdn.net/C20190413/article/details/77368590
Description
给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0。n的位数为m。
现在从m位中删除k位(0<k < m),求生成的新整数最小为多少?
例如: n = 9128456, k = 2, 则生成的新整数最小为12456
Input
第一行t, 表示有t组数据;
接下来t行,每一行表示一组测试数据,每组测试数据包含两个数字n, k。
Output
t行,每行一个数字,表示从n中删除k位后得到的最小整数。
Sample Input
2
9128456 2
1444 3
Sample Output
12456
1
int main()
{
int t,k;
long long n;
cin >> t;
while (t--)
{
cin >> n >> k;
vector<int> arr;
while (n > 0)
{
arr.push_back(n % 10);
n = n / 10;
}
vector<int> flag(arr.size(),1);
int cur = arr.size()-1;
while (k>0) {
while (cur>0 && arr[cur] <= arr[cur - 1])
cur--;
if (cur > 0) {
arr.erase(arr.begin() + cur);
}
else {
arr.erase(arr.begin());
}
k--;
cur--;//!!注意这里要索引-1,因为数组中少了一个元素,
//要继续遍历该数组时一定要索引-1后继续遍历
}
int result = 0;
for (int i = arr.size() - 1; i >= 0; i--) {
result = result * 10 + arr[i];
}
cout << result;
}
return 0;
}
3.要记得等号右边要int到long的转换
vector<long> arr(nums2.size()+1);
arr[0]=(long)INT_MAX+1;
4.stl的字典序比较
#include<algorithm>
lexicographical_compare(arr.begin(),arr.end(),brr.begin(),brr.end())
//若arr序列字典序 < brr字典序返回true,否则返回false
5.在使用dfs暴力搜索(回溯法)时,对于数量可以使用公有变量的方式,加完后进入递归,返回时再减掉,但是对于布尔量(条件限制)一定得写在递归函数的参数中传递下去,且返回时无需改回去,否则可能会改变之前的限制。
6.找字符串s的最长回文前缀可以对字符串s#s’使用kmp求next数组的方法。(其中s’是s的reverse),最长回文前缀的长度即是next[-1].
7.对于dfs函数想用visited数组时可以先声明共有变量数组visited(不定义元素数量和值),在main函数里面使用visited.resize(n,value)初始化visited数组后调用dfs函数