算法第4章实验报告

一、题目

4-2 删数问题

 

二、算法描述

  为了让删数后的数最小,高位应该尽可能的小,所以在使用贪心算法策略的时候应该从最高位作比较删除。

  确定我们的贪心策略:当当前的数,比后一位数大时,删去当前的数。

  删去数的时候,需要多一个下标变量 j 去代表遍历的 i 变量去删数。

  这道题有个坑点,那就是前导零,需要注意100000,删除1后结果应为0

 

三、代码实现

#include <iostream>
#include <string.h>
using namespace std;
char a[1000]; 
int k,i,len;
int flag=1;
int main()
{
    cin>>a>>k;         
    len=strlen(a);  //数组a的长度 
    while(k!=0)     //只要s不为0,就继续减数 
    {
        i=0;
        while(a[i]<=a[i+1])    //升序数列 ,不再是升序就退出循环 
            i++;
        while(i<len-1)   //删除 
        {
            a[i]=a[i+1];
            i++;
        }
        len--;
        k--;
    }
    for(int i=0;i<len;i++)
    {
        if(a[i]=='0'&&i<len-1&&flag==1) //排除最高位为0的情况 
            continue;
        else{
            cout<<a[i];
            flag=0;
        }
    }
    return 0;
}

 

四、算法时间复杂度

   删数过程中,k次循环删数中嵌套两个与输入字符串长度n相关的循环,则时间复杂度为:O(k*n*n)

   删数完成之后,一次检查0的循环:O(n)

   则最后的时间复杂度为:O(n²)

 

五、贪心算法的个人体会和理解

贪心算法主要思路是:
  (1)把求解的问题分成若干个子问题;
  (2)对每个子问题求解,得到子问题的局部最优解;
  (3)把子问题的局部最优解合成原来问题的一个解。

所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的仅仅是在某种意义上的局部最优解

posted @ 2021-11-14 14:12  梁惠怡  阅读(48)  评论(0编辑  收藏  举报