package com.example.demo.leecode;
/**
* 字符串转整数
* @Date 2020/11/25
* @author Tang
*
* 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:
*
* 如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
* 假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
* 该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。
* 注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。
*
* 在任何情况下,若函数不能进行有效的转换时,请返回 0 。
*
* 提示:
*
* 本题中的空白字符只包括空格字符 ' ' 。
* 假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
*/
public class StringToInteger {
String str;
int index = 1;
public int change(String s){
//字符串为null情况
if(s == null){
return 0;
}
this.str = s.trim();
char[] chars = str.toCharArray();
//都是空格字符情况
if (chars.length == 0){
return 0;
}
//如果首字母是符号
if(ifSymbol(chars[0])){
getIndex(chars);
}else if(ifNum(chars[0])){
//去掉开头的所有0
chars = getNoZeroBegin(chars, 0);
if(chars.length == 0){
return 0;
}
//去掉0后还非法
if(ifSymbol(chars[0]) || !ifNum(chars[0])){
return 0;
}
getIndex(chars);
}else{
return 0;
}
///只有一个符号位,后边没有数字
if(index == 0 && ifSymbol(chars[0])){
return 0;
}
int res = 0;
String result = String.valueOf(chars, 0, index+1);
try {
res = Integer.parseInt(result);
}catch (Exception e){
if(chars[0] == '-'){
return Integer.MIN_VALUE;
}else{
return Integer.MAX_VALUE;
}
}
return res;
}
//获取要截取数字的结束位置
private void getIndex(char[] chars){
for(;index < chars.length; index++){
if(!ifNum(chars[index])){
break;
}
}
index --;
}
//递归获取首字符为0的字符数组
private char[] getNoZeroBegin(char[] chars, int index){
if(chars.length == 0){
return chars;
}
if(chars[index] == '0'){
String s = String.valueOf(chars, index+1 , chars.length - index-1);
chars = s.toCharArray();
chars = getNoZeroBegin(chars, index);
}
return chars;
}
/**
* 判断是否为正负号
* @param c
* @return
*/
private boolean ifSymbol(char c){
return c == '+' || c == '-';
}
/**
* 判断是否是数字
* @return
*/
private boolean ifNum(char c){
return c > '0' && c < '9';
}
public static void main(String[] args) {
//应输出42
String value1 = "42";
//应输出-42
String value2 = " -42";
//应输出4193
String value3 = "000cc4193 with words";
//应输出0
String value4 = "words and 987";
//应输出0
String value5 = null;
//应输出0
String value6 = " 0000000000000 ";
StringToInteger stringToInteger = new StringToInteger();
int change = stringToInteger.change(value6);
System.out.println(change);
}
}