對一個只包含數字和小寫字母的字串中的正整數數字子串按數字大小進行升序排序,其余字符的相對位置保持不變,只在原數字子串的上進行變動,比如字串為“aaa77xxxx88jj44”,進行排序后的結果是“aaa44xxxx77jj88”,非數字子串”aaa”、”xxxx”和”jj”的相對位置保持不變。
需要考慮:
(1)整數溢位,比如數字串為:”99999999999999999999999999999999”,不能把子串轉化成整數相比;
(2)首位是0的數字串的處理,比如“00000000000000006”是小于“7”的。
請用Java撰寫演算法實作排序并輸出經過排序的字串。
測驗案例:
1、"123xyz87bbbbg66666666hhhhhh444"
2、"aa999999999999999xyz7777bb0000005"
3、"aaaaaaaa"
4、"100000"
5、"zzzzz100000bbb11ccc899989898989dd220bbbbbbbbbbbbbbbbbb"
6、"zzzzz9999999999999999999999bbb0000000011ccc899989898989dd220bbbbbbbb"
我的想法是這樣子的:
先將字串中的字母部分和數字部分分開,分別放到兩個陣列str1,str2中,記錄在字串中的位置,然后對str2中的數進行從小到大排序,str1不變,最后在講str1和排序后的str2進行合并,在輸出字串。
可是代碼實作不會
uj5u.com熱心網友回復:
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test07 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "zzzzz9999999999999999999999bbb0000000011ccc899989898989dd220bbbbbbbb";
System.out.println(str);
String pattern = "\\D+|\\d+";
Pattern r = Pattern.compile(pattern);
Matcher matcher = r.matcher(str);
List<String> l1 = new ArrayList<String>();
List<String> l2 = new ArrayList<String>();
while(matcher.find()){
String temp = matcher.group();
if(l1.size() == l2.size())
l1.add(temp);
else
l2.add(temp);
}
Comparator<String> comparator = (x, y) -> new BigDecimal(x).compareTo(new BigDecimal(y));
if(Character.isDigit(l1.get(0).charAt(0)))
l1.sort(comparator);
else
l2.sort(comparator);
String res = "";
for(int i = 0; i < l1.size(); i++){
res += l1.get(i) + (i < l2.size() ? l2.get(i) : "");
}
System.out.println(res);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/279454.html
標籤:Java相關
