算法第4章实践报告

一.

7-2 删数问题

给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。

输入格式:

第 1 行是1 个正整数 a。第 2 行是正整数k。

输出格式:

输出最小数。

代码实现:

#include<iostream>
using namespace std;
int main(){
	string str;
	int n ;
	int i ,len;
	cin>>str>>n;
		while(n--){
			i=0;
             len=str.size();
            while(str[i]<=str[i+1]&&i<len)i++;
            while(i<len)
            {
                str[i]=str[i+1];
                i++;
            }

		}
		len = str.size();
		i = 0;
		while(str[i]=='0')
           i++;

		if(i<len)
        {
            while(i<len)
            {
                cout<<str[i];
                i++;
            }
        }
     

		}
	

  

算法思想:从字符串从前往后寻找一个递增序列,之后将该数列的最大数删去,即将后续数字前移,覆盖该数字。用i指向最大数值的位置,直到删去的数字即覆盖的数字达到n,循环停止。之后输出最小数。

时间复杂度:代码的主要算法部分有两层循环,循环的次数是k*n次,其中k表示要删除的位数,n表示整数a的位数,即时间复杂度为:O(kn)

空间复杂度:算法中定义了一个char型的数组,用来存储整数a的各个位数,即n位数,即空间复杂度为:O(n)

三.总结反思

这次编程中,我用字符串接受正整数,输出后字符串后几位都为空格,我以为输出是133333,结果输出全为空格,后来我发现数字前移过程中,将字符串最后的空格带入字符串,使我明白原因。

 

posted @ 2018-12-01 00:17  陳泽博Czmichael  阅读(135)  评论(0编辑  收藏  举报