2011-04-15 55 views
3

這是一個我有點麻煩的作業問題。確定字符串是否爲十六進制數的遞歸方法 - Java

編寫一個遞歸方法來確定字符串是否是十六進制數。 爲你的方法寫javadocs。 如果每個字符是 0或1或2或3或4或5或6或7或8或9 或a或A或b或B或c或C或d或D或e或E或f或f。

目前所有我可以看到測試這是如果字符串0的字符是他給了我這些值之一,那麼它的一部分是一個十六進制。

任何提示或建議,以幫助我?

這是我到目前爲止有:`

public boolean isHex(String string){ 


    if (string.charAt(0)==//what goes here?){ 
     //call isHex again on s.substring(1) 
    }else return false; 
    } 

`

+0

你在正確的軌道上。查找String.substring,並考慮如何設置字符串中所有字符的遞歸檢查。 – sverre 2011-04-15 19:31:24

+1

請發佈您的代碼,我們可以看到它有什麼問題。 – NateTheGreat 2011-04-15 19:32:39

+0

@sverre我在uni中有類似的東西(我們都不是?),我的TA試圖告訴我我的方法很差,因爲它使用了'String.substring()'解釋它使我的方法'O(n^2)'。我和教授一起拿着它(用String類的源代碼來證明我的情況)。讓我們希望Joel的TA不是那麼天真! :-) – corsiKa 2011-04-15 19:35:16

回答

4

由於這是功課,我只給出一些提示,而不是代碼:

編寫始終測試的方法字符串的第一個字符,如果它符合要求。如果不是,則返回false,如果是,則使用相同的字符串再次調用該方法,但缺少第一個字符。如果它只剩下1個字符並且它也是一個十六進制字符,則返回true。

僞代碼:

public boolean isHex(String testString) { 


    If String has 0 characters -> return true; 

    Else 

     If first character is a hex character -> call isHex with the remaining characters 

     Else if the first character is not a hex character -> return false; 

} 
+0

我能夠在我的代碼中得到這些,但我遇到麻煩的是這部分。 「如果第一個字符是一個十六進制字符」如果(s.charAt(0)=='A')再次調用isHex,是否必須創建類似這樣的東西,但是我必須爲A-F和從0-9這麼做嗎? – 2011-04-15 20:01:11

+0

最簡單的測試方法是:if(s.string(0,1))。等於(「A」)|| s.subString(0,1).equals(「B」)....) – RoflcoptrException 2011-04-15 20:33:36

+0

噢好吧。我試圖避免這種情況,但我想我必須這樣做。 – 2011-04-15 20:37:25

0

聽起來像是你應該遞歸遍歷字符串中的字符,並返回boolean值和當前字符是否是在[0-9A-Fa-f]與遞歸調用...

5

如果你正在尋找一個良好的十六進制數字的方法:

boolean isHexDigit(char c) { 
    return Character.isDigit(c) || (Character.toUpperCase(c) >= 'A' && Character.toUpperCase(c) <= 'F'); 
} 

提示或建議,根據要求:

  1. 所有遞歸方法調用自己與不同的輸入(當然,希望不同的輸入!)
  2. 所有遞歸方法有一個停止條件。

你的方法簽名應該是這個樣子

boolean isHexString(String s) { 
    // base case here - an if condition 

    // logic and recursion - a return value 

} 

而且,不要忘記,十六進制字符串可以以「0x」開始。這可能(更)難以做到,所以我會先讓常規函數工作。如果稍後解決它,請記住0xABCD0x123不應該通過。:-)

關於子:直從String類來源:

public String substring(int beginIndex, int endIndex) { 
if (beginIndex < 0) { 
    throw new StringIndexOutOfBoundsException(beginIndex); 
} 
if (endIndex > count) { 
    throw new StringIndexOutOfBoundsException(endIndex); 
} 
if (beginIndex > endIndex) { 
    throw new StringIndexOutOfBoundsException(endIndex - beginIndex); 
} 
return ((beginIndex == 0) && (endIndex == count)) ? this : 
    new String(offset + beginIndex, endIndex - beginIndex, value); 
} 

偏移類型的成員變量int

值是類型的成員變量char[]

和它調用的構造函數是

String(int offset, int count, char value[]) { 
this.value = value; 
this.offset = offset; 
this.count = count; 
} 

這顯然是一個O(1)方法,調用一個O(1)構造函數。它可以做到這一點,因爲字符串是不可變的。您不能更改字符串的值,只能創建一個新字符串。 (因爲它們是無關的解決方案,所以我們忽略了諸如反射和sun.misc.unsafe之類的東西!)因爲它不能改變,所以你也不必擔心其他的線程會與它混淆,所以它可以像村莊一樣通過自行車。

+0

@ikegami考慮通過'0xx123'。不是有效的十六進制字符串'1230x456'也不是。但是,由於'0x456'是,並且假設你的算法通過了這個測試,所以當你修改了'123'時,你會留下'0x456',但你會想返回false。這是一個(稍微)更具挑戰性的問題,但它仍然是一個問題。 – corsiKa 2011-04-15 19:45:30

+0

Yep在上面看到了你的評論,並且已經刪除了錯誤的第一條評論。我保持糾正:) – Voo 2011-04-15 20:05:11

1

當遞歸地解決問題時,通常需要解決一小部分('基礎案例'),然後遞歸剩下的部分。

你已經想出了基本情況 - 檢查單個字符是否爲十六進制。

現在你需要「緩解其餘的」。

下面是扭轉一個字符串的僞代碼(Python的ISH) - 希望你將看到如何類似的方法可以應用到你的問題(事實上,所有的遞歸問題)

def ReverseString(str): 
    # base case (simple) 
    if len(str) <= 1: 
     return str 

    # recurse on the rest... 
    return last_char(str) + ReverseString(all_but_last_char(str)) 
0

你已經收到了許多有用的答案。如果你想訓練你的遞歸技巧(以及一般的Java技能),我可以推薦你訪問Coding Bat。你會發現很多練習和自動化測試。

相關問題