http://www.1point3acres.com/bbs/thread-210668-2-1.html
给你两个string,表示两个数,比如“132”,“32.5”,比较两个数的大小。要求one pass,不能用库函数。idea两分钟搞定,但因为实力有限,写代码交流费了不少时间,然后跑了跑case,问了问问题就结束了。
你当然可以把数恢复出来做。比如一个一个读,每次先把旧的×10,遇到小数点就改一下策略。
记录一下小数点的位置,之前的数*10 + 新的digit然后变成float型的然后加上小数点后面的
感觉第一题先扫到小数点,先比较整数部分,如果一样再比较小数部分,小数部分也不用全部扫完,第一个不一样的就返回了
给你两个string,表示两个数,比如“132”,“32.5”,比较两个数的大小。要求one pass,不能用库函数。idea两分钟搞定,但因为实力有限,写代码交流费了不少时间,然后跑了跑case,问了问问题就结束了。
你当然可以把数恢复出来做。比如一个一个读,每次先把旧的×10,遇到小数点就改一下策略。
记录一下小数点的位置,之前的数*10 + 新的digit然后变成float型的然后加上小数点后面的
感觉第一题先扫到小数点,先比较整数部分,如果一样再比较小数部分,小数部分也不用全部扫完,第一个不一样的就返回了
public static int compare(char[] arr1, char[] arr2) {
int index1 = 0, index2 = 0, result = 0, sign = 1;
boolean isNeg1 = false, isNeg2 = false;
if(arr1[index1] == '-') isNeg1 = true;
if(arr2[index1] == '-') isNeg2 = true;
if(!isNeg1 && isNeg2) return 1;
else if(isNeg1 && !isNeg2) return -1;
else if(isNeg1 && isNeg2) {
index1++; index2++;
sign = -1;
}
while(index1 < arr1.length && arr1[index1] != '.' && index2 < arr2.length && arr2[index2] != '.') {
if(result == 0 && arr1[index1] > arr2[index2]) {
result = 1;
} else if(result == 0 && arr1[index1] < arr2[index2]) {
result = -1;
}
index1++; index2++;
}
boolean isEnd1 = false, isEnd2 = false;
if(index1 >= arr1.length || arr1[index1] == '.') isEnd1 = true;
if(index2 >= arr2.length || arr2[index2] == '.') isEnd2 = true;
if(isEnd1 && !isEnd2) {
return -1 * sign;
} else if(!isEnd1 && isEnd2) {
return 1 * sign;
} else if(isEnd1 && isEnd2) {
if(result != 0) return result * sign;
. 鐗涗汉浜戦泦,涓€浜╀笁鍒嗗湴
index1++; index2++;
char next1 = index1 >= arr1.length ? '0' : arr1[index1];
char next2 = index2 >= arr2.length ? '0' : arr2[index2];
while(index1 < arr1.length || index2 < arr2.length) {
if(next1 > next2) {
return 1 * sign;
} else if(next1 < next2) {
return -1 * sign;
}
index1++; index2++;
next1 = index1 >= arr1.length ? '0' : arr1[index1];
next2 = index2 >= arr2.length ? '0' : arr2[index2];
}
}
return 0;
}