将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0
数据范围:字符串长度满足
进阶:空间复杂度
,时间复杂度 %20%5C)
进阶:空间复杂度
注意:
①字符串中可能出现任意符号,出现除 +/- 以外符号时直接输出 0
②字符串中可能出现 +/- 且仅可能出现在字符串首位。
输入一个字符串,包括数字字母符号,可以为空
如果是合法的数值表达则返回该数字,否则返回0
"+2147483647"
2147483647
"1a33"
0
import java.util.*;
public class Solution {
public int StrToInt(String str) {
if(str==null||str.equals("")){ //若为空或者为空字符则无效
return 0;
}
int count=0; //最后的数字
int n=1;//每一次的乘数,先是从1开始
int flg=1;//默认为1,代表正数,只要最后返回 count*flg即可
char[] contrast={'0','1','2','3','4','5','6','7','8','9'};//对比转换string和int的数组
String str1="";
//先拿到下标0处的元素
if(str.charAt(0)=='+'){
//为正数,不变
} else if (str.charAt(0)=='-'){
flg=-1; //为负数
} else if (str.charAt(0)>='0'&&str.charAt(0)<='9') { //为数字
str1+=str.charAt(0); //下标0处是数字,则拼接到str1上去
}else { //不合法元素
return 0; //下标0处的元素为字符,使用返回0
}
for(int i=1;i<str.length();i++){ //先得到数字,从1下标开始,因为0已经判断了
if (str.charAt(i)>='0'&&str.charAt(i)<='9'){ //是数字则拼接
str1+=str.charAt(i);
}else {
return 0;//遇到字符,返回0
}
}
//上面已经得到了我们想要的数字字符串了,在str1里面
for (int i=str1.length()-1;i>=0;i--){ //从最后拿取每一个数据
for (int j=0;j<contrast.length;j++){ //遍历对照数组,相等的时候,拿的到下标就是当前字符对应的数字
if(str1.charAt(i)==contrast[j]){ //数据对上了
count+=j*n;//最后一位的值
n*=10; //为接下来的一位做准备
break; //跳出对比的循环
}
}
}
return count*flg;
}
}
public class Solution {
public int StrToInt(String str) {
char crr[] = str.toCharArray();
int flag = 1;
int sum = 0;
int i = 0;
if (crr.length == 0) {
return 0;
}
if (crr[0] == '-' || crr[0] == '+') {
if (crr[0] == '-') {
flag = -1;
}
i++;
}
for (; i < crr.length; i++) {
if (crr[i] >= '0' && crr[i] <= '9') {
sum = sum * 10 + (crr[i] - '0');
} else {
return 0;
}
}
return sum * flag;
}
} public class Solution {
public int StrToInt(String str) {
char[] s = str.toCharArray();
if (str.length() == 0 || str == null) return 0;
int flag = 1;
if (s[0] == '-') flag = -1;
if (s[0] == '+' || s[0] == '-' ) s[0] = '0';
int sum = 0;
for (int i = 0; i < s.length; i++) {
if (!(s[i] >= '0' && s[i] <= '9')) return 0;
else {
sum = sum * 10 + (s[i] - '0');
}
}
return sum * flag;
}
} public class Solution {
public int StrToInt(String str) {
char[] chs = str.toCharArray();
if(chs == null || chs.length == 0) {
return 0;
}
int flag = 1;
int sum = 0;
if(chs[0] == '+') {
flag = 1;
chs[0] = '0';
} else if(chs[0] == '-') {
flag = -1;
chs[0] = '0';
}
for (int i = 0; i < chs.length; i++) {
if(chs[i] < '0' || chs[i] > '9') {
sum = 0;
break;
}
sum = sum * 10 + chs[i] - '0';
}
return flag*sum;
}
}
public class Solution {
public int StrToInt(String str) {
if(str == null || str.length() == 0){
return 0;
}
int a = 1;
char[] ch = str.toCharArray();
if(ch[0] == '-'){
a = -1;
ch[0] = '0';
}
if(ch[0] == '+'){
a = 1;
ch[0] = '0';
}
int sum = 0;
for(int i = 0;i < ch.length;i++){
if(!Character.isDigit(ch[i])){
sum = 0;
break;
}
sum = sum *10 + ch[i] -'0';
}
return sum * a;
}
} public class Solution {
public int StrToInt(String str) {
try {
if(str ==null || str.length() ==0){
return 0;
}
if(str.length() ==1 ){
if(!isdigit(str.charAt(0))){
return 0;
}
return str.charAt(0) - ('0');
}
//肯定长度大于1
if(str.charAt(0)!='+' && str.charAt(0) !='-' && !isdigit(str.charAt(0))){
return 0;
}
boolean[] flag= new boolean[]{false,false};//false,false代表是负数
if(str.charAt(0)=='+' || isdigit(str.charAt(0))){
//是正数
if(str.charAt(0)=='+'){
//第一位是+号
flag[0] = true;
flag[1] = true;
}
if(isdigit(str.charAt(0))){
flag[0] = true;
flag[1] = false; //第一位是数字
}
}
//肯定第一位是符合标准的
for (int i = 1; i < str.length(); i++) {
if(!isdigit(str.charAt(i))){
return 0;
}
}
//每一位都是符合标准的
char[] chars = str.toCharArray();
if(flag[0] & flag[1]){
//如果第一位是+号
int ret = 0;
for (int i = 1; i < chars.length; i++) {
ret = ret* 10 + chars[i] - '0';
}
return ret;
}
else if(flag[0] & !flag[1]){
//如果第一位是数字
int ret = 0;
for (int i = 0; i < chars.length; i++) {
ret = ret * 10 + chars[i] - '0';
}
return ret;
}
else{
//第一位是负数
int ret = 0;
for (int i = 1; i < chars.length; i++) {
ret = ret* 10 + chars[i] - '0';
}
return -ret;
}
} catch (NumberFormatException e) {
return 0;
}
}
public boolean isdigit(char number){
if( number >= '0' && number <= '9'){
return true;
}
else{
return false;
}
}
} import java.util.*;
public class Solution {
public int StrToInt(String str) {
StringBuilder s = new StringBuilder(str);
if(s.length()==0) return 0;
int sym = 1;
if(s.charAt(0) == '-'){
sym = -1;
s.deleteCharAt(0);
}
else if(s.charAt(0) == '+'){
sym = 1;
s.deleteCharAt(0);
}
int sum = 0;
for(int i = 0; i < s.length(); i++){
if(s.charAt(i) < '0' || s.charAt(i) > '9'){
sum = 0;
break;
}
else{
sum = sum * 10 + (s.charAt(i) - '0');
}
}
return sym * sum;
}
} import java.util.*;
public class Solution {
public int StrToInt(String str) {
int flag = 1;
int sum = 0;
char[] strArr = str.toCharArray();
for(int i = 0 ; i < strArr.length ; i++){
if(strArr[i] >= 48 && strArr[i] <=57){
sum += (strArr[i]-48)*Math.pow(10,strArr.length - i - 1);
}else{
if(i == 0){
if(strArr[i] == '-'){
flag *= -1;
}else if(strArr[i] == '+'){
continue;
}else{
return 0;
}
}else{
return 0;
}
}
}
return sum*flag;
}
} //我觉得Leetcode上的题目用例更加严谨一些
class Solution {
public int myAtoi(String s) {
s=s.trim();
if(s.length()==0) return 0;
int flag=1;
int id=0;
if(s.charAt(0)=='+'){
id++;
flag=1;
}else if(s.charAt(0)=='-'){
id++;
flag=-1;
}else{
flag=1;
}
long sum=0;
while(id<s.length()){
if(!Character.isDigit(s.charAt(id))) break;
int n=s.charAt(id)-'0';
if(sum>Integer.MAX_VALUE || (sum>=Integer.MAX_VALUE/10 && n>Integer.MAX_VALUE%10)){
return flag==1? Integer.MAX_VALUE:Integer.MIN_VALUE;
}else{
sum=sum*10+n;
id++;
}
}
if(flag*sum>Integer.MAX_VALUE){
return Integer.MAX_VALUE;
}else if(flag*sum<Integer.MIN_VALUE){
return Integer.MIN_VALUE;
}else{
return flag*(int)sum;
}
}
} public class Solution {
public int StrToInt(String str) {
if(str == null || str.length() == 0) {
return 0;
}
String s = str.trim();
char[] chs = s.toCharArray();
if(chs.length == 1) {
if(!Character.isDigit(chs[0])) {
return 0;
} else {
return chs[0] - '0';
}
}
// 第一个字符不是加减号,也不是数字
if(chs[0] != '+' && chs[0] != '-' && !Character.isDigit(chs[0])) {
return 0;
}
int ans = 0, index = 0;
boolean isNegative = false;
if(chs[0] == '-') {
isNegative = true;
index++;
} else if(chs[0] == '+') {
isNegative = false;
index++;
} else {
index = 0;
}
for(int i = index; i < chs.length; i++) {
if(!Character.isDigit(chs[i])) {
return 0;
}
ans = ans*10 + (chs[i] - '0');
}
if(isNegative) {
ans = -ans;
}
return ans;
}
} import java.util.HashMap;
public class JZ49 {
public static void main(String[] args) {
JZ49 jz49 = new JZ49();
System.out.println(jz49.StrToInt("2147483647"));
System.out.println(jz49.StrToInt("-2147483648"));
System.out.println(jz49.StrToInt("-2147483649"));
}
private HashMap<Character, Integer> map = new HashMap<>(){
{
put('0', 0);
put('1', 1);
put('2', 2);
put('3', 3);
put('4', 4);
put('5', 5);
put('6', 6);
put('7', 7);
put('8', 8);
put('9', 9);
}
};
public int StrToInt(String str) {
if (str == null || str.isEmpty()) {
return 0;
}
char firstChar = str.charAt(0);
int index = 0;
//默认是正号
int limit = -Integer.MAX_VALUE;
boolean flag = true;
//第一位不是数字
if (!map.containsKey(firstChar)) {
//只有单独一个符号,非法
if (str.length() == 1) {
return 0;
}
index++;
//第一位是负号
if (firstChar == '-') {
flag = false;
limit = Integer.MIN_VALUE;
}
//第一位非法符号
else if (firstChar != '+'){
return 0;
}
}
int result = 0;
for (;index < str.length(); index++) {
//正常数字
if (map.containsKey(str.charAt(index))) {
int digit = map.get(str.charAt(index));
result = result * 10;
int r = limit + digit;
//溢出判断
if (result < limit + digit) {
return 0;
}
result = result - digit;
//非法字符
} else {
return 0;
}
}
return flag ? -result : result;
}
}
public class Solution {
public int StrToInt(String str) {
int f =0;
int i =0;
int zf=1;
if(str ==null || str.equals(""))
return 0;
if(str.charAt(0)=='-')
{
i=1;
zf=0;
}
if(str.charAt(0)=='+')
i=1;
for(i=i;i<str.length();i++)
{
int c =str.charAt(i);
if(c>='0' && c<='9')
{
f=f*10+c-'0';
}
else
return 0;
}
return zf==1?f:-f;
}
} //走到这里,说明是有效字符,且不是正负号
//超过2147483647
if(!flag && res * 10 >= 2147483640 && ch[i] >= '8'){
return Integer.MAX_VALUE;
}
//小于-2147483648
if(flag && res * 10 >= 2147483640 && ch[i] >= '9'){
return Integer.MIN_VALUE;
} public int StrToInt(String str) {
int res = 0;
char[] ch = str.toCharArray();
boolean flag = false;//flag为true表示负数
for(int i = 0; i < ch.length; i++){
//存在不合法字符,直接返回0
if(!(ch[i] >= '0' && ch[i] <= '9') && ch[i] != '-' && ch[i] != '+') return 0;
if(i == 0 && ch[i] == '-'){
flag = true;
continue;
}else if(i == 0 && ch[i] == '+'){
continue;
}
//走到这里,说明是有效数字
//超过2147483647:如果res > 214748364, 则res至少为214748365,res*10必然>2147483647
//如果卡边界,res * 10 = 2147483640,则ch[i]为0~7时合法
if(!flag && ((res > 214748364) || (res == 214748364 && ch[i] >= '7'))){
return Integer.MAX_VALUE;
}
//小于-2147483648
if(flag && ((res > 214748364) || (res == 214748364 && ch[i] >= '8'))){
return Integer.MIN_VALUE;
}
res = res * 10 + ch[i] - '0';
}
return flag ? -res : res;
} public int StrToInt(String str) {
boolean matches = str.matches("[+-]?\\d+");
if (!matches) {
return 0;
} else {
int temp = 1;
int index = str.length()-1;
int result = 0;
if (str.matches("\\d+")){
while (index >= 0) {
result += (str.charAt(index--) - 48) * temp;
temp*=10;
}
} else {
while (index > 0) {
result += (str.charAt(index--) - 48) * temp;
temp*=10;
}
if (str.charAt(index) == '-') {
result = -result;
}
}
return result;
}
}
public class Solution {
public int StrToInt(String str) {
if(str.isEmpty()){
return 0;
}
int res=0;
int len = str.length()-1;
int x=1;
while(len>=0){
if(str.charAt(len)=='-'){
res = -res;
}else if(str.charAt(len)=='+'){
}else if(str.charAt(len)<='9' && str.charAt(len)>='0'){
res = res + (str.charAt(len)-'0')*x;
x=x*10;
}else{
res=0;
break;
}
len --;
}
return res;
}
} public class Solution {
public int StrToInt(String str) {
if(str.length() == 0) return 0;//空值
int index = 0;
int res = 0;
int sign = 1;//记录符号
char[] arr = str.toCharArray();//图方便
//首位可以是 + - 0~9
if(arr[0] == '-'){
sign = -1;
index++;
}
else if(arr[0] == '+'){
index++;
}
//非法字符
else if(arr[0] > '9' || arr[0] < '0'){
return 0;
}
//逐位遍历
while(index < arr.length){
if(arr[index] > '9' || arr[index] < '0') return 0;
//合法字符
res = (res == 0)? arr[index] - '0' : res*10 + arr[index] - '0';
index++;
System.out.println(res);
}
return sign*res;
}
} 印象中lc是要判断溢出的,提交后发现这里不用,就算了
public int StrToInt(String str) {
if(str==null || str.length()==0) return 0;
long result =0;// 用long不用考虑数组越界
boolean flag = true;// 结果为正数
if(str.startsWith("-")){
flag = false;
str = str.substring(1,str.length());
}else if(str.startsWith("+")){
str = str.substring(1,str.length());
}
for(int i=str.length()-1;i>=0;i--){
if(str.charAt(i)<='9'&&str.charAt(i)>='0'){
result +=Math.pow(10,str.length()-i-1)*( str.charAt(i)-'0');
}else{
result=0;
break;
}
}
if(!flag) result = -result;
return (int) result;// 结果强转为int
} //这个方法可以判断溢出,即数字大于2147483647时,输出0;
//或者数字小于-2147483648时,输出0;
public int StrToInt(String str) {
if (str == null)
return 0;
int result = 0;
boolean negative = false;//是否负数
int i = 0, len = str.length();
/**
* limit 默认初始化为 负的 最大正整数 ,假如字符串表示的是正数
* 那么result(在返回之前一直是负数形式)就必须和这个最大正数的负数来比较,
* 判断是否溢出
* 注意,int最大值为:2147483647 int最小值为:-2147483648
* 超过该范畴,即为溢出,那么就返回0。
*/
int limit = -Integer.MAX_VALUE; //limit = -2147483647 最小的INT型负数是-2147483648,因此无溢出,可以用int表示。
int multmin;
int digit;
if (len > 0) {
char firstChar = str.charAt(0);//首先看第一位
if (firstChar < '0') { // Possible leading "+"&nbs***bsp;"-"
if (firstChar == '-') {
negative = true;
limit = Integer.MIN_VALUE;//在负号的情况下,判断溢出的值就变成了整数的 最小负数了
} else if (firstChar != '+')//第一位不是数字和-只能是+
return 0;
if (len == 1) // Cannot have lone "+"&nbs***bsp;"-"
return 0;
i++;
}
//limit要么等于-Integer.MAX_VALUE=-2147483647,要么等于Integer.MIN_VALUE=-2147483648。
multmin = limit / 10; //如果结果值是正数,此时multmin为:-214748364;如果是负数,此时multmin为:-214748364。两者相同
while (i < len) {
// Accumulating negatively avoids surprises near MAX_VALUE
digit = str.charAt(i++)-'0';//char转int
if (digit < 0 || digit > 9)//0到9以外的数字
return 0;
//判断溢出
if (result < multmin) { //假设现在i到了最后一位,i=len-1,假设此时result正好是-214748364
return 0; //如果小于-214748364,即-214748365,-214748366,-2147483657,-2147483658,-2147483659。 //说明待会儿肯定小于-2147483648,肯定溢出,则输出0。注意:这时候最后一位还没加入,接下来开始加入.....
}
result *= 10;//此时 result = -2147483640
if (result < limit + digit) { //这里相当于 result-digit < limit,判断溢出;为了避免数字溢出导致代码无法执行,因此这样表达
return 0; //溢出
}
result -= digit; //经过上面一个if语句的判断,发现不会溢出,那么就将最后一位加入至result
}
} else {
return 0;
}
//如果是正数就返回-result(result一直是负数)
return negative ? result : -result;
}