2013-11-14 25 views
2

如何刪除數字中的某個數字,以便獲得的數字最小?如何刪除數字中的某個數字,以便獲得的數字最小?

具體而言,我想要寫int remove_digits(int large, int num_digits_to_remove)使得一個函數:

  1. 任何num_digits_to_remove數字是從large除去雖然從它的字符串表示除去字符
  2. 返回的號碼有可能的最低值從步驟1中刪除數字

例如,從69469813中刪除4位數將給出4613

我寧願用C寫的答案

+0

研究模數運算符。 – enhzflep

+0

歡迎來到StackOverflow!我編輯了你的問題,試圖更清楚你的算法在做什麼。我說得對嗎,還是你想做一些不同的事情? – Kevin

+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

我不知道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應該是很容易的,我只用一些基本的操作。

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 
+1

請注意,ensc的解決方案不適用於,例如,319刪除一個。在這種情況下,你想刪除3(如我的解決方案中所做的),而不是9。 – rockhyrax

相關問題