【问题标题】:finding minimum number in a integer找到整数中的最小数字
【发布时间】:2015-08-08 05:58:23
【问题描述】:

给定一个 n 位数字和一个数字“k”。您必须从数字中删除“k”位数字,并从剩余的“n-k”位数字中给出最短的数字,以使数字序列保持不变。例如,如果号码是 637824 并且 k = 3。所以你必须从给定的号码中删除 3 位数字。由剩余数字组成的数字应尽可能小,并且不得更改数字顺序。所以输出应该是324。

我使用的方法与包含排除逻辑相同:

输入 63119 和 K=2:

选择 9 + (6311) 的最小值 = 19 或 不要选择 9,选择 1 + minimum of(631) = 11 并且最终取最小值

对于输入 4567813 和 k=3:

选择 3 和 1 以及最小值 (45678) = 413

我正在使用递归逻辑来解决这个问题,但我无法用代码实现这一点,我现在已经力不从心了。我需要有关此递归的帮助。我不追求更好的解决方案。

    #define min(a, b) ((a)>(b)?(b):(a));

    int minimum(char *s, int i, int j)
    {
            if (i == j)
                    return s[i] - '0';
            return min(s[j]-'0', minimum(s, i, j-1));
    }

    int add_up(char *s, int i, int j)
    {
            int sum = 0, mul = 1;
            while(i < j) {
                    sum = sum + (s[j] - '0')*mul;
                    j--;mul *= 10;
            }
            return sum;
    }

    int foo(char *s, int size, int j, int k)
    {
            int sum = 0, i, mul = 1;
            if (k < 0 || j > size || j < 0)
                    return 0;
            if ((k == 0) && (j != 0))
                    return add_up(s, 0, j);
            if ((k == 1) && (j != 0))
                    return minimum(s, 0, j);
            if (k-1 == j)
                    return add_up(s, 0, j);
            for (i=k;i>=0;i--) {
                    sum += min((s[j]-'0')+10*foo(s, size, j-1, k-1), foo(s, size, j-1, k));
            }
            return sum;
    }

    int main()
    {
            char s[] = {"4567813"};
            printf("%d\n", foo(s, strlen(s)-1, strlen(s)-1, 2));
            return 0;
    }

【问题讨论】:

    标签: algorithm recursion dynamic-programming


    【解决方案1】:

    你说过最后取了所有的最小值,但你取了所有的最小值,然后添加了它们。您需要为每个i 取最小值,并在sum 中保存所有 i 的最小值。请参阅代码以进行说明。您的add_up 函数中也存在错误,它应该添加到i&lt;=j

    int add_up(char *s, int i, int j)
    {
        int sum=0, mul=1;
        while(i <= j) {  // modification here
            sum=sum + (s[j] - '0')*mul;
            j--; mul*=10;
        }
        return sum;
    }
    
    int foo(char *s, int size, int j, int k)
    {
        int sum=INT_MAX, i, mul=1;
        if(k < 0 || j > size || j < 0)
            return 0;
        if((k == 0) && (j != 0))
            return add_up(s, 0, j);
        if((k == 1) && (j != 0))
            return minimum(s, 0, j);
        if(k-1 == j)
            return add_up(s, 0, j);
        for(i=k; i>=0; i--) {
            int res=min((s[j]-'0')+10*foo(s, size, j-1, k-1), foo(s, size, j-1, k));  
            sum=min(sum,res); // minimum over all possible i
        }
        return sum;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-07
      • 2015-06-07
      • 2022-06-15
      • 2017-03-05
      • 2020-05-29
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      相关资源
      最近更新 更多