算法第四章实践
1.实践题目:删数问题
2.题目形式:给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。
输入格式:
第 1 行是1 个正整数 a。第 2 行是正整数k。
输出格式:
输出最小数。
3.算法描述:(代码解析
在原正数序列中,依次寻找非递增序列的首位数字(即S[i]>s[i+1]时的S[I]),将其删去,依次循环至删够题目要求的个数
格外要注意的是:当留下的数字前面数字为0时(包括连续几个零的情况),要做删0操作(20到26行)
1int main()
2{
3char s[150];
4int n;
5
6cin >> s >> n;
7while(n > 0){
i8nt len = strlen(s);
9int i =0;
10while(i < len && s[i] <= s[i+1]){
11i++;
12}
13while(i < len){
14s[i] = s[i+1];
15i++;
16}
17n--;
18}
19int k;
20while(s[0] == '0'){
21k = 0;
22int len = strlen(s);
23while(k < len){
24s[k] = s[k+1];
25k++;
26}
27}
28if(strlen(s) == 0){
29cout<<0;
30}
31else{
32cout<<s;
33}
4.算法时间及空间复杂度分析:
时间复杂度:题目要在长度为n的数组中删除K个数,需要进行K次循环,所需时间复杂度为O(nk),去零操作所需复杂度为O(n-k),因此最后时间复杂度为O(n)
空间复杂度:用了长为n的数组进行存储,空间复杂度为O(n)
5.此次上机,在这道题花费的时间较多,主要问题在于基础不够扎实,把问题复杂化,并且忽略了00的情况,在测试数据时出错弄了很久,这也是算是一次学习吧,在和队友的不断探讨互相指正的过程中学到了双倍的知识