对一个只包含数字和小写字母的字符串中的正整数数字子串按数字大小进行升序排序,其余字符的相对位置保持不变,只在原数字子串的上进行变动

qq_45804624 2021-04-23 08:10:48
对一个只包含数字和小写字母的字符串中的正整数数字子串按数字大小进行升序排序,其余字符的相对位置保持不变,只在原数字子串的上进行变动,比如字符串为“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进行合并,在输出字符串。

可是代码实现不会
...全文
520 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_45804624 2021-04-27
  • 打赏
  • 举报
回复
引用 1 楼 nayi_224 的回复:
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);
	}

}
谢谢你
nayi_224 2021-04-23
  • 打赏
  • 举报
回复
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);
	}

}

51,397

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧