2011-03-25 73 views
0

我有一些int值,它的名字是number。我有其他的int值,它的名字是x。我想知道是否x存在於number或不存在。目前我將數字轉換爲string()並使用string.Contain(x)方法。我認爲這不是一個好方法,它的拳擊和表演受到傷害。如何檢查int中是否存在數字?

有沒有更好的方法來做到這一點?

附加信息: number可能是一個或多個數字,例如12345. x總是一位數字。

+0

請舉例。數字總是單個數字嗎?實際上'x'是字符串表示中的一個整數,還是可能是多個數字(例如,逗號分隔)? – 2011-03-25 07:53:00

+0

將'int'轉換爲'string'不是裝箱。你怎麼確定'int'到'string'的轉換是瓶頸? – 2011-03-25 07:53:15

+0

這個方法看起來和任何假設一樣好,通過「contains」,你的意思是一個數字的字符串版本出現在另一個數字的字符串版本中。 – 2011-03-25 07:55:59

回答

3

這不是一個壞方法。我能想到的唯一選擇是使用重複分割和模數運算的東西,這些運算的數量可能會比較慢。

我會堅持你有什麼,除非有一個嚴重性能問題。基於


您的附加信息:

number可以是一個或多個數字,例如,12345 x始終是一個數字。

我會選擇以下(僞代碼):

def numContains (number, digit): 
    if number == 0 and digit == 0: 
     return true 
    while number != 0: 
     if number % 10 == digit: 
      return true 
     number = number/10 
    return false 

因爲你,如果你在一個0通過number和你還有沒有進入while第一if是必需的以捕獲numberdigit均爲0的情況。

否則,您只需繼續檢查number的最低有效位數與digit,並將number每次除以10。

如果在number到達零之前找到匹配項,則它包含該數字。否則它不會。

這可能會比您的字符串解決方案更快,因爲它將不得不執行類似的操作來從整數中創建字符串,然後在上面執行字符串比較。

但是,正如所有的優化,措施,不要猜測!


而且,現在我有機會到我的VS2008開發中,她是爲它的一些C#代碼:

// Function: containsDigit, returns whether non-negative number holds a digit. 
//  In: num, the integer to check. 
//   dgt, the digit to look for. 
//  Out: Boolean representing whether digit found in number. 
// Notes: Digit is coerced to a single digit. 

Boolean containsDigit(UInt32 num, UInt32 dgt) { 
    dgt = dgt % 10;    // silently force contract compliance. 
    if ((num == 0) && (dgt == 0)) // Zero contains zero. 
     return true; 
    while (num != 0) {    // While more digits in number. 
     if ((num % 10) == dgt)  // Return true if rightmost digit matches. 
      return true; 
     num = num/10;   // Get next digit into rightmost position. 
    } 
    return false;     // No matches, return false. 
} 
+1

然後再一次,有多少個算術計算可以匹配多少個字符串比較? ......我現在閉嘴:) – BoltClock 2011-03-25 07:58:19

+0

而這正是關於極限性能的重要因素:) – fjdumont 2011-03-25 08:08:41

1

如果x是單一的數字:

for (int n = number; n > 0; n /= 10) 
{ 
    int digit = number % 10; 
    if (digit == x) return true; 
} 

如果x是多位數字:

int xd = 0; 
for (y = x; y > 0; y /= 10) xd++; 

for (int n = number; n > 0; n /= 10) 
{ 
    int digit = number % xd; 
    if (digit == x) return true; 
} 
2

不,它不使用拳擊,但它確實創建了對象。

使用字符串是一個很好的解決方案,除非你需要非常卓越的性能,否則你應該堅持下去。

你可以用數字解決它。然後,您首先需要找出x中有多少個數字,以便您可以使用模數來掩蓋number的一部分。然後你可以循環和檢查number的不同部分x

int mask = 10; 
while (mask <= x) mask *= 10; 
bool found = false; 
while (number >= mask) { 
    if (number % mask == x) { 
    found = true; 
    break; 
    } 
    number /= 10; 
}