算法第4章实践报告
2018-11-26 11:08 water_chen 阅读(174) 评论(0) 编辑 收藏 举报1、实践题目
7-2 删数问题 (110 分)
2、问题描述
给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。
输入格式:
第 1 行是1 个正整数 a。第 2 行是正整数k。
输出格式:
输出最小数。
输入样例:
在这里给出一组输入。例如:
178543
4
输出样例:
在这里给出相应的输出。例如:
13
3、算法描述
#include<iostream> #include<algorithm> #include<string.h> using namespace std; int main() { int m; int len,t=0; char ch[100]; cin >> ch >> m; t=m; len=strlen(ch); if(m>=len) { cout<<"0"<<endl; } while(m>0) { int i=0; while(i<len&&ch[i]<=ch[i+1])//寻找顺序,如果遇到逆序,就把后面的值往上牵动,用于去除局部最大值 i++; for(int j=i; j<len; j++) ch[j]=ch[j+1]; m--; } int l=0; if(ch[0]=='0') { while(ch[l]=='0') l++; } for(int j=l; j<len-t; j++) cout<<ch[j]; cout<<endl; }
找到局部升序中最大的数字,并将之后的数往前替换,循环n次,去掉n个局部升序最大的数字,剩下的就是这个数字中最小的数的组合。
4、算法时间及空间复杂度分析(要有分析过程)
时间复杂度:O(n),核心算法就是去掉n个局部升序的最大数的while循环,所以就是O(n)
空间复杂度:O(1),设置了t,存储n,因为n会在while循环中作为计数器,t做计数器也可以;设置l,防止出现‘\0’。
5、心得体会
最苦恼的是怎么得到一个最小的数,而且一开始理解错了,以为是无序,就案例如果是378541,也是出现13的话该怎么做,后来知道理解错了,而且得到一个最小的数,其实是这串数字中最小数字的组合,那么每次删掉数留下来的数字之外的数,还要保持原有的顺序,就想到了去除局部升序的数字串的最大数字,然后循环n次,就可以去掉n个局部循环的最大数。这个是我和我的伙伴一起想的最久的问题。