这道题之前面甲骨文的时候被问过。当时是不要求判断正负号的。
一般被问到什么问题,还是看心情。自己面别人也一样。所以不要迷信题库。
这里写的是可以转换正数和负数的。
如果数字中间有空格,则只转换空格之前的部分。
会判断无效的输入(非数字).
需要注意的几点:
- char的 ‘0’, ‘1’, ‘2’, ‘3’字符如何转换成对应的数字
char - '0' - 对于Max, Min的判断, 这里只说Max的,Min的在代码里,思路差不多
如果 result 在 计算下一位的时候已经比Max的1/10要大,则说明输入值已经超出范围。
如果result 在 计算下一位的时候与Max的1/10一样大,则看下一个加入的数字是否不大于Max的最后一位。
/**
* Created by creat on 2018/7/19.
* If there is space in the Integer, return the first part
* Can print and validate both Positive and Negative numbers
* Get the result in One loop. startOfInput -> startPosition, startPosition -> endOfValidInput
*/
public class StringToInteger {
int IN_VALID_NUMBER_CODE = -1;
char SPACE = ' ';
int TENTH_OF_MAX_INT = Integer.MAX_VALUE / 10;
int LAST_DIGIT_OF_MAX_INT = Integer.MAX_VALUE % 10;
int TENTH_OF_MIN_INT = Integer.MIN_VALUE / 10;
int LAST_DIGIT_OF_MIN_INT = 0 - Integer.MIN_VALUE % 10;
public static void main(String[] args) {
StringToInteger sti = new StringToInteger();
System.out.println("Max Int = " + Integer.MAX_VALUE + " And Min Int = " + Integer.MIN_VALUE);
System.out.println(sti.convertStringToInteger("1234")); // happy path positive
System.out.println(sti.convertStringToInteger("-1")); // happy path negative
System.out.println(sti.convertStringToInteger("2147483647")); // happy path max int
System.out.println(sti.convertStringToInteger("+2147483647")); // happy path max int with sign
System.out.println(sti.convertStringToInteger("-2147483648")); // happy path min int
System.out.println(sti.convertStringToInteger("2147483648")); // too big
System.out.println(sti.convertStringToInteger("-2147483649")); // too small
System.out.println(sti.convertStringToInteger(" +2147483647 ")); // happy path max int and space
System.out.println(sti.convertStringToInteger(" -2147483648 ")); // happy path min int and space
System.out.println(sti.convertStringToInteger(" -214 7483648 ")); // happy path min int and space, take the valid part before space
// below are invalid input tests
System.out.println("***************** Below are Invalid Input tests***************");
System.out.println(sti.convertStringToInteger("ab123cd"));
System.out.println(sti.convertStringToInteger("+0123"));
System.out.println(sti.convertStringToInteger("-0123"));
System.out.println(sti.convertStringToInteger("-123abc123"));
}
public int convertStringToInteger(String str) {
if (str == null || str.isEmpty()) {
System.out.println("No Input");
return IN_VALID_NUMBER_CODE;
}
int result = 0;
int beginPosition = -1;
int firstNumberPosition = -1;
char[] contents = str.toCharArray();
for (int i = 0; i < contents.length; i++) {
if (contents[i] == SPACE) {
continue;
}
if (isSign(contents[i]) || isDigit(contents[i])) {
beginPosition = i;
break;
}
}
if (beginPosition == IN_VALID_NUMBER_CODE) {
System.out.print("Invalid Input");
return IN_VALID_NUMBER_CODE;
}
if (isSign(contents[beginPosition])) {
firstNumberPosition = beginPosition + 1;
} else {
firstNumberPosition = beginPosition;
}
if (contents[firstNumberPosition] == '0') {
System.out.print("Invalid Input");
return IN_VALID_NUMBER_CODE;
}
for (int j = firstNumberPosition; j < contents.length; j++) {
if (contents[j] == SPACE) {
return result;
}
int digit = getDigit(contents[j]);
if (digit == IN_VALID_NUMBER_CODE) {
System.out.print("Invalid Input");
return IN_VALID_NUMBER_CODE;
}
if (isPositive(contents[beginPosition]) && result > TENTH_OF_MAX_INT) {
System.out.print("The input number is too large");
return IN_VALID_NUMBER_CODE;
}
if (isPositive(contents[beginPosition]) && result == TENTH_OF_MAX_INT && digit > LAST_DIGIT_OF_MAX_INT) {
System.out.print("The input number is too large");
return IN_VALID_NUMBER_CODE;
}
if (!isPositive(contents[beginPosition]) && result > 0 - TENTH_OF_MIN_INT) {
System.out.print("The input number is too small");
return IN_VALID_NUMBER_CODE;
}
if (!isPositive(contents[beginPosition]) && result == 0 - TENTH_OF_MIN_INT && digit > LAST_DIGIT_OF_MIN_INT) {
System.out.print("The input number is too small");
return IN_VALID_NUMBER_CODE;
}
result *= 10;
result += digit;
}
return isPositive(contents[beginPosition]) ? result : 0 - result;
}
private boolean isPositive(char c) {
return c == '+' || isDigit(c);
}
private int getDigit(char c) {
if (isDigit(c)) {
return c - '0';
} else {
return IN_VALID_NUMBER_CODE;
}
}
private boolean isDigit (char c) {
return c >= '0' && c <= '9';
}
private boolean isSign(char c) {
return c == '+' || c == '-';
}
}
网友评论