上周五去新浪微博面试了,上机做了一道笔试题,结果在规定的时间内没有完成,面试也没有成功,比较郁闷。没做出来这个题主要还是自己能力问题,附加对苹果机器的使用不习惯吧,不说这个了,还是书归正题,把这个问题解决了,以缓解自己的心情。
这个题的要求(可能记得不太全):
1. 不能使用任何math的任何方法;
2. round(value, pointNum)求出输入字符串value的精度为pointNum的四舍五入的值。如round("12345.6789", 3)得出12345.679
3. 字符串value可能不是数字,需要作出判断;
4. 字符串可能很长,超出整型范围。
差不多就这些;
我的代码是这样的:
import java.util.ArrayList;
import java.util.List;
public class MyMath {
//是否需要进位 ---小数部分 向 整数部分进位
private static boolean isNeedCarry = false;
public static String round(String val , int pointNum){
isNeedCarry = false;
//切分 整数部分 和 小数部分
String[] valParts = val.split("\\.");
if(valParts.length<2){
return val;
}
String intPart = valParts[0];
String decimalPart = valParts[1];
//处理小数部分
if(pointNum>=decimalPart.length()){
return val;
}
decimalPart = decimalPart.substring(0,pointNum+1);
//利用hashMap存储分段后的partLast
int partLen = 9;
List decimalPartList = getSplitNumberList(decimalPart,partLen);
StringBuilder sb = new StringBuilder();
//传入小数部分 和 是否为整数部分false
String calculateDecimal=calculate(decimalPartList,false);
sb.insert(0,calculateDecimal);
sb.insert(0, ".");
if(isNeedCarry){
List partFirstList = getSplitNumberList(intPart,partLen);
sb.insert(0,calculate(partFirstList,true));
}else{
sb.insert(0, intPart);
}
String retrunStr = sb.substring(0, sb.toString().length()-1).replaceAll("(0)*$", "").replaceAll("\\.$", "");
return retrunStr;
}
private static String calculate(List operateList, boolean isIntPosition) {
boolean isCarryBit = isNeedCarry;
StringBuilder sb = new StringBuilder();
for (int j = operateList.size() - 1; j >= 0; j--) {
String item = operateList.get(j);
try {
int temp = Integer.parseInt(item);
//精确度计算 末位+5..将精确度的后一位+5, 完成四舍五入操作。
if(!isIntPosition && j==operateList.size() - 1){
temp = temp + 5;
}
if (isCarryBit) {
temp = temp + 1;
}
sb.insert(0, temp);
if (String.valueOf(temp).length() > item.length()) {
// 如果不是 ( 整数部分 并且是 整数的最高位)则需要去除进位;
if (!(isIntPosition && j == 0)) {
sb.delete(0, 1);
}
isCarryBit = true;
} else {
isCarryBit = false;
}
} catch (NumberFormatException nfe) {
System.out.println("val 参数输入不是数字");
break;
}
}
isNeedCarry = isCarryBit;
return sb.toString();
}
public static List getSplitNumberList(String valStr, int partLen) {
List list = new ArrayList();
int itemLen = 0;
int listSize = valStr.length() / partLen + 1;
for (int i = 0; i < listSize; i++) {
itemLen = partLen * (i + 1) < valStr.length() ? partLen * (i + 1)
: valStr.length();
String item = valStr.substring(partLen * i, itemLen);
list.add(item);
}
return list;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(round("12345.6789", 3));
System.out.println(round("12345.6789", 1));
System.out.println(round("5.6", 3));
System.out.println(round("0.9999", 3));
System.out.println(round("9.9099", 3));
System.out.println(round("99.9099", 3));
System.out.println(round("99.9999", 3));
System.out.println(round("-99.9999", 3));
System.out.println(round("-99.9099", 3));
System.out
.println(round(
"999999999999999999999999999999999999999999.99999923232399999999999999999",
3));
}
}