代码改变世界

算法第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个局部循环的最大数。这个是我和我的伙伴一起想的最久的问题。