java字符串排序

java字符串排序
今天收到一个公司的面试邀请,人还没去,直接面试题都发过来了,真仗义啊。哈哈哈,我看了一下面试题,难度还是挺高的,怪不得直接给我。
我大致看了一下关于java方面的面试题,我还是对其中一个编程题挺感兴趣的,题目如下:
在这里插入图片描述
就是对一个无序字符串进行排序,主要难度在怎么处理字母的排序,Arrays类和Collections类提供的排序方法都是大写字母在前的,题目要求的是小写在前。这就是个考点,废话不多说直接上代码:


import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

/**
 * 
 * @author 谢辉 2019.8.9
 *
 */
public class StrSplit {
	public static void main(String[] args) {
		System.out.println(sortStr("3Ba1cA"));
	}

	/**
	 * 思路:
	 * 1、先对字符串拆分,进行第一次排序,目的是把数字提取出来
	 * 2、数字提取出来后利用集合工具类得到排序后的字母(缺点是大写的字母在前,不是想要的结果) 
	 * 3、利用冒泡排序改变大小写
	 * 
	 * @param str
	 * @return
	 */
	public static String sortStr(String str) {
		// 形参拆分
		char[] charArray = str.toCharArray();
		// 存取结果
		StringBuilder result = new StringBuilder();
		// 对数组排序:数字、大写字母、小写字母
		Arrays.sort(charArray);

		int index = 0;
		// 查找最后一位数字紧挨着的大写字母下标(将会使用该下标截取字符串)
		// 0的ASCII码是48 9的ASCII码是57
		for (int i = 0; i < charArray.length; i++) {
			if (Integer.valueOf(charArray[i]) > 57) {
				index = i;
				break;
			}
		}
		// 先截取出所有数字
		String temp = String.valueOf(charArray);
		result.append(temp.substring(0, index));

		// 剩下纯字母字符串
		String newStr = temp.substring(index);
		// 利用集合对字母数组排序
		List<String> list = new LinkedList<>();
		char[] array = newStr.toCharArray();
		for (char c : array) {
			list.add(String.valueOf(c));
		}
		Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
		System.out.println(list.toString());// [A, a, B, b, c, d, Z, z]

		// 排序后的字母都是大写的在前面
		String[] strTemp = new String[list.size()];
		for (int i = 0; i < strTemp.length; i++) {
			strTemp[i] = list.get(i);
		}
		// 利用冒泡排序进行对比,改变大小写
		for (int i = 0; i < strTemp.length - 1; i++) {
			for (int j = 0; j < strTemp.length - 1 - i; j++) {
				if (strTemp[j].equals(strTemp[j + 1])) {
					continue;
				} else if (strTemp[j].equalsIgnoreCase(strTemp[j + 1])) {
					strTemp[j] = strTemp[j].toLowerCase();
					strTemp[j + 1] = strTemp[j + 1].toUpperCase();
				}
			}
		}

		// 拼接字符串
		for (int i = 0; i < strTemp.length; i++) {
			result.append(strTemp[i]);
		}

		return result.toString();
	}
}

在这里插入图片描述
这个题就算答完了,嗯?答完了?作为程序员要举一反三啊,假如面试官要求:d8A68acD 排序此字符串为688acdAD怎么办?
有办法继续上代码:

import java.util.Arrays;

public class A {
	public static void main(String[] args) {
		System.out.println(sortStr("36z1ZaBbdc8","aA0"));
	}
	
	/**
	 * 
	 * @param str 需要排序的字符串
	 * @param splitRule 定义的规则:默认是0Aa
	 * @return 排序后的字符串
	 * 规则介绍:
	 * 对于排序规则定义了一个0、A、a三个字符组成的字符串规则,
	 * 0aA表示数字所有排序后的数字在前面,所有排序后的小写字母在中间,所有大写字母在最后
	 * 规则有:0Aa(默认)、A0a、0aA、a0A、aA0
	 */
	public static String sortStr(String str, String splitRule) {
		/**
		 * 思路: 
		 * 1、把字符串拆开,用Arrays工具类进行排序,排序规则是:数字-大写字母-小写字母 
		 * 2、根据规则按照ASCII码再次拆分字符串
		 * 3、第一次拆分是把数字部分拆出来 
		 * 4、第二次把所有大写字母拆分出来 
		 * 5、第三次把所有小写字母拆分出来 
		 * 6、按要求再次拼接
		 */
		// 0的ASCII码是48 9的ASCII码是57
		// A的ASCII码是65 Z的ASCII码是90
		// a的ASCII码是97 z的ASCII码是122

		// 形参拆分
		char[] charArray = str.toCharArray();
		// 存取结果
		StringBuilder result = new StringBuilder();
		// 对数组排序:数字、大写字母、小写字母
		Arrays.sort(charArray);
		if (null == splitRule || "".equals(splitRule)) {
			return String.valueOf(charArray);
		}

		
		
		
		/*
		 * 开始第一次截取
		 */
		int index = 0;
		// 查找最后一位数字紧挨着的大写字母下标(将会使用该下标截取字符串)
		for (int i = 0; i < charArray.length; i++) {
			if (Integer.valueOf(charArray[i]) > 57) {
				index = i;
				break;
			}
		}
		// 第一次截取:所有数字
		String temp = String.valueOf(charArray);
		// result.append(temp.substring(0, index));

		
		
		
		
		/*
		 * 开始第二次截取
		 */
		// 该字符串就是去掉数字的字符串了
		String newStr = temp.substring(index);
		int index2 = 0;
		char[] newCharArr = newStr.toCharArray();
		// 找到最后一个大写字母紧挨着的小写字母下标(使用该下标截取字符串)
		for (int i = 0; i < newCharArr.length; i++) {
			if (Integer.valueOf(newCharArr[i]) > 90) {
				index2 = i;
				break;
			}
		}
		// 截取到的就是所有小写字母
		// result.append(newStr.substring(index2));
		
		
		
		
		/*
		 * 开始第三次截取
		 */
		// 截取到的就是所有大写字母
		// result.append(newStr.substring(0, index2));

		String finalResult = "";
		// 为了程序的扩展性,对一下排序规则做了定义,就是按照规则追加字符串
		if ("0aA".equals(splitRule)) {
			result.append(temp.substring(0, index));
			result.append(newStr.substring(index2));
			result.append(newStr.substring(0, index2));
			finalResult = result.toString();
		} else if ("A0a".equals(splitRule)) {
			result.append(newStr.substring(0, index2));
			result.append(temp.substring(0, index));
			result.append(newStr.substring(index2));
			finalResult = result.toString();
		} else if ("aA0".equals(splitRule)) {
			result.append(newStr.substring(index2));
			result.append(newStr.substring(0, index2));
			result.append(temp.substring(0, index));
			finalResult = result.toString();
		}else if ("a0A".equals(splitRule)) {
			result.append(newStr.substring(index2));
			result.append(temp.substring(0, index));
			result.append(newStr.substring(0, index2));
			finalResult = result.toString();
		}
		return finalResult;

	}
}

总之面试官的要求千变万化,解决问题先有思路,然后问题迎刃而解…
在这里只是分享面试题,希望技术大牛勿喷,谢谢大牛的照顾。同时希望小伙伴们指出错误和不足之处,谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图图小淘气_real

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值