算法第4章实践报告

算法第4章实践报告

1.实践题目

7-2 删数问题

 

 

2.问题描述

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

 

3.算法描述

 

    if(n==strlen(a)){  // 删除的长度跟数字长度一样的时候输出为0
        cout << 0;
        return 0; 
    } 

    while(n>0) { 
        i=0;
        while(i<strlen(a) && a[i]<=a[i+1] ) //如果左边比右边大,删除
            i++;  
        for(j=i;j<strlen(a);j++) 
            a[j]=a[j+1];
        int k;
        while(a[0] == '0'){ //如果首位为0,将0删掉
            k = 0;
            while(k < strlen(a)){
            a[k] = a[k+1];
            k++;
            }
        }
        n--; 
    }  
    cout << a << endl;

 

4.算法时间及空间复杂度分析

时间复杂度分析:判断删除长度跟数字长度的时间复杂度为常数;第一个while大循环循环了n次,大while循环里还有for循环和小的while循环,其循环次数为数字a的长度次,约等于n次,总的时间复杂度为O(n2)。

空间复杂度分析:定义了一个一维数组,空间复杂度为S(n)。

 

5.心得体会

 一开始跟队友在怎么把数字转换为数组这个问题上纠结了很久,但是发现转为数组之后,怎么改测试点都不能通过,最后就在百度上查找了这种比较方式。还有将前置0删掉的问题,本来以为是删掉前置0后继续删除n个数字,后来才发现是删除完n个数字之后再把前置0删掉,如果题目可以说清楚的话可以省去一些纠结的时间。

posted @ 2018-12-02 18:58  liujieyu  阅读(125)  评论(0编辑  收藏  举报