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