3

得られる数値が最小になるように、数値の特定の桁数を削除するにはどうすればよいですか?

具体的には、次のような関数を書きたいと思いますint remove_digits(int large, int num_digits_to_remove)

  1. 文字列表現から文字を削除するかのように、任意num_digits_to_removeの数字が削除されますlarge
  2. 返される数値は、ステップ 1 のように桁を削除して可能な最小値になります。

たとえば、 から 4 桁を削除する69469813と、4613

Cで書かれた回答を好むでしょう。

4

3 に答える 3

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) です。

于 2013-11-14T22:25:58.813 に答える
-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 に変換するのはかなり簡単なはずです。いくつかの基本的な操作だけを使用しました。

于 2013-11-14T22:39:14.043 に答える