想起之前阿里的面试题,简单跟大家分享一下:
两个字符串倒序求和
例如:
字符串a = "123",字符串b = "234";
倒序之后: a="321",b="432";
将结果转int 求和:753 ,结果输出为753。
请列举出所有可能出现的情况。
问题分析:
1.字符串可能为空,为null
2.字符串可能是负数,可能有小数,可能非数字
3.代码规范+优雅
4.难度不大,重点在手撕,本人属于手撕较差的,str.toCharArray()都会写成str.toCharArrays()哈哈!
我的解决方案:
public static void main(String[] args) {
String str1 = "0阿萨德76asda6", str2 = "-01.1a2";
System.out.println(addStr(str1, str2));
}
/**
* 两个字符串倒序求和
* 例:
* String str1 = "123";
* String str2 = "456";
* <p>
* return 975
*/
public static int addStr(String str1, String str2) {
return checkStrParam(str1) + checkStrParam(str2);
}
/**
* 主方法
*/
private static Integer checkStrParam(String str) {
System.out.println("开始执行+++++++++++++源数据:" + str);
Integer result;
boolean isNegative;
String symbol = "-", point = ".";
//NULL&空字符处理
str = isBank(str);
//空格处理
str = str.trim();
//负数处理
isNegative = isNegative(str, symbol);
//小数处理
str = havePoint(str, point);
//过滤&倒序处理
str = orderDesc(str);
//负数补充'-'符号
str = isNegative ? symbol + str : str;
System.out.println("执行完毕+++++++++++++最终数据:" + str);
//得出结果
result = Integer.valueOf(str);
return result;
}
private static String isBank(String str) {
if (StringUtils.isBlank(str)) {
str = "0";
System.out.println("str为空,返回0");
}
return str;
}
private static boolean isNegative(String str, String symbol) {
String str2 = StringUtils.EMPTY;
char[] chars = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
if (String.valueOf(chars[i]).matches("[^0-9]")) {
str2 += chars[i];
}
}
return str2.contains(symbol);
}
private static String havePoint(String str, String point) {
if (str.contains(point)) {
int index = str.indexOf(point);
System.out.println("小数舍去。");
str = str.substring(0, index);
}
System.out.println("负数转换结果:" + str);
return str;
}
private static String orderDesc(String str) {
String result = StringUtils.EMPTY;
//去除非数字
String regEx = "[^0-9]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
str = m.replaceAll("").trim();
System.out.println("非数字转换结果:"+str);
//倒序,并且负数加 -
char[] chars1 = str.toCharArray();
for (int i = 0; i < chars1.length; i++) {
String temp = String.valueOf(chars1[i]);
result = temp + result;
}
System.out.println("字符倒排结果:"+result);
return result;
}
开始执行+++++++++++++源数据:0阿萨德76asda6
负数转换结果:0阿萨德76asda6
非数字转换结果:0766
字符倒排结果:6670
执行完毕+++++++++++++最终数据:6670
开始执行+++++++++++++源数据:-01.1a2
小数舍去。
负数转换结果:-01
非数字转换结果:01
字符倒排结果:10
执行完毕+++++++++++++最终数据:-10
6660
代码供参考,有不严谨的地方可以讨论一下,谢谢。