如何删除数字中的一定数量的数字,以便获得的数字最小?

时间:2013-11-14 22:06:55

标签: c min digit

如何删除数字中的一定数量的数字,以便获得的数字最少?

具体来说,我想编写一个函数int remove_digits(int large, int num_digits_to_remove),以便:

  1. num_digits_to_remove中移除任何large个数字,就像从字符串表示中删除字符一样
  2. 返回的数字具有从步骤1中删除数字的最低可能值
  3. 例如,从69469813中移除4位数即可获得4613

    我更喜欢用C语言写的答案。

3 个答案:

答案 0 :(得分:3)

点子:

char number[] = "69469813";
char digits[ARRAY_SIZE(number)];
size_t i;

// sort digits; complexity O(n * log n);
sort_digits(digits, number);   // -> digits becomes "99866431"

for (i = 0; i < number_of_digits_to_be_removed; ++i) {
     size_t j;
     for (j = 0; j < ARRAY_SIZE(number); ++j) {
         if (number[j] == digits[i]) {
             number[j] = 'X';      // invalidate it
             break;
         }
     }
 }

 for (i = 0; i < ARRAY_SIZE(number); ++i)
     if (number[i] != 'X')
         printf("%c", number[i]);

整件事的复杂性为O(n * m);

答案 1 :(得分:1)

基本思路是,如果你只能删除一个数字,你想要删除第一个数字(从最高位数开始),后面跟一个较小的数字。

例如,如果你的号码是123432,你想要删除4(因为后面是3),结果是12332。

然后,您可以根据要删除的位数重复此过程:

char *num = "69469813";
char *buf = malloc(strlen(num)+1);
size_t to_remove = 4;

while (to_remove --> 0) {
    char *src = num;
    char *dst = buf;

    while (*src < *(src+1)) { *dst++ = *src++; } // Advance until the next digit is less than the current digit
    src++;                                       // Skip it
    while (*dst++ = *src++);                     // Copy the rest

    strcpy(num, buf);
}
printf("%s\n", num); // Prints 4613

答案 2 :(得分:-1)

我不知道C,但这是我在java中的表现:

String original = "69469813";
String result = "";

int numNeedToBeTaken = 4;
int numLeft = original.length() - numNeedToBeTaken;

while(result.length() < numLeft)
{
    String temp = original.substring(0,original.length()-numNeedToBeTaken+1);
    int smallest= 9;
    int index = 0;
    for(int i = 0; i<temp.length(); i++)
    {
        int number = Integer.parseInt(Character.toString(temp.charAt(i)));
        if( number < smallest)
        {
            smallest = number;
            index = i+1;
        }
    }
    numNeedToBeTaken--;
    result = result.concat(String.valueOf(smallest));
    original = original.substring(index);
}
Log.d("debug","result: "+result); //tested to work with your example, returns 4613

将此转换为C应该非常简单,我只使用了一些基本操作。