剑指offer——把字符串转换成整数(Java中int与String的相互转换、ASCII码)

剑指offer——把字符串转换成整数(Java中int与String的相互转换、ASCII码)

1 知识点储备

1.1 字符串与整数相互转换常用库函数

1)String转换成int类型:在 Java 中要将 String 类型转化为 int 类型时,需要使用 Integer 类中的 parseInt() 方法或者 valueOf() 方法进行转换。

  1. int i = Integer.parseInt([String]);//直接使用静态方法,不会产生多余的对象,但会抛出异常
  2. int i = Integer.valueOf(my_str).intValue();//Integer.valueOf(s) 相当于 new Integer(Integer.parseInt(my_str)),也会抛异常,但会多产生一个对象
    举例:
    利用parseInt()方法:
String str="123";
try{
    int a = Integer.parseInt(str);
} catch (NumberFormatException e){
    e.printStackTrace();
}

利用valueOf()方法:

String str="123";
try{
    int b = Integer.valueOf(str).intValue();
}catch(NumberFormatException e){
    e.printStackTrace();
}

2)int类型转换成String类:在 Java 中要将 int 类型转化为 String 类型时,需要使用 Integer 类中的 toString() 方法或者String类中的 valueOf() 方法进行转换,也可以使用重载的 “+” 运算符进行强制类型转换,即: + ""

  1. 通过Integer.toString(i)方法转换:利用 String s = Integer.toString(i);
  2. 通过String.valueOf(i)方法转换为字符串:利用String s = String.valueOf(i);//直接使用String类的静态方法,只产生一个对象
  3. 通过‘+’链接,将整型强制转换一下字符串:利用String s = "" + i;//会产生两个String对象

1.2 必背ASCII码

ASCII码从0到127,即(2的0次方减1)到(2的7次方减1).
- 字符’0’对应的ASCII码值是48(转化为int类型);
- 字符’9’对应的ASCII码值是57 (48+10-1=57);
- 字符‘A’对应的ASCII码值是65;
- 字符‘Z’对应的ASCII码值是90(65+26-1=90);
- 字符‘a’对应的ASCII码值是97;
- 字符‘z’对应的ASCII码值是122(97+26-1=122);
- 字符‘NULL(null)’对应的ASCII码值是0,‘NULL(null)’解释为空字符;
- 字符‘ (space)’对应的ASCII码值是40,‘ (space)’解释为空格;

其他相关ASCII码值见百度百科:ASCII

1.3 其它小知识点:将字符串转换为字符数组

  1. String.toCharArray() 方法 ,作用:将字符串转换为字符数组。
  2. String.charAt(int index)方法:返回下标为index处的字符,利用for循环,实现将字符串存放到数组中。
  3. String.substring(int beginIndex,int endIndex)方法:返回索引位置从beginIndex(包括)到endIndex(不包括)的子串,利用for循环,实现将字符串存放到数组中。

例子:
1)String.toCharArray() 方法:将String对象的每一个下标位的对象保存在char[]中

String a = "abcd";
char[] b = a.toCharArray();
//此时b数组中保持的信息就是['a','b','c','d']

区分: String.split()方法:根据你需要按照的分隔符来分割字符串。

String a = "avc,d,e,s,f";
String[] b = a.split(',');
//根据逗号将数据分开;
//遍历输出得到的b的对象为"avc","d","e","s","f"

2)利用String.charAt()方法:返回下标为index处的字符,利用for循环,边读取字符串中的数字,边赋值给字符数字。

import java.util.Scanner;
public class Solution{
    public void main(String[] args){
        char[] chs = new char[100];
        String str;
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入字符串: ");
        str = sc.nextLine();//下面有对nextLine()方法的解释
        System.out.println();
        for(int i=0;iout.print(chs[i] + "");
        }       
    }
}

解释:

nextLine()next()

next()读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。
nextLine()方法的结束符只是Enter键,即nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的.

在控制台上输入” hello”

Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
System.out.println(s);

打印出来的是” hello”

Scanner scanner = new Scanner(System.in);
String s = scanner.next();
System.out.println(s);

打印出来的是”hello”,自动舍去了有效字符前的空格。

假如有一段文本如下:
abc def ghij
kl mno pqr st
uvw xyz
你用next(),第一次取的是abc,第二次取的是def,第三次取的是ghij
你用nextLine(),第一次取的是abc def ghij,第二次取的是kl mno pqr st,第三次取的是uvw xyz
明白了吧。前一个是以回车或空格为分隔符,一次取一个单词,后一个是以回车为分隔符,一次取一行

3)String.substring(int beginIndex,int endIndex)方法:返回索引位置从beginIndex(包括)到endIndex(不包括)的子串,利用for循环,实现将字符串存放到数组中。

String a = "abc";
String[] arr = new String[a.length()];
for(int i = 0; i 
    arr[i] = a.substring(i, (i+1));
}//最后输出数组就可以了。System.out.println(java.util.Arrays.toString[arr]);

2 题目描述

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0

2.1 输入描述:

输入一个字符串,包括数字字母符号,可以为空

2.2 输出描述:

如果是合法的数值表达则返回该数字,否则返回0

2.3 示例1

输入

+2147483647
1a33

输出

2147483647
0

2.4 题目分析

边界条件:空字符串,字符串长度为0;

2.5 我的答案

2.5.1 错误答案

public class Solution {
    public int StrToInt(String str) {
        if(str=="" || str.length()==0){
            return 0;
        }
        int sum=0;
        int fuhao=1;//当第一位为正或无符号时,置符号位为1
        /*if(str.charAt(0)=='-'){
            fuhao=-1;
        }
        if(str.charAt(0)=='+' || str.charAt(0)=='-'){
            str = str.substring(1,str.length());
        }*/
        if(str.charAt(0)=='-'){
            fuhao=-1;//当第一位为符号时,置符号位为-1
            str = str.substring(1,str.length());
        }
        if(str.charAt(0)=='+'){
            str = str.substring(1,str.length());
        }
        char[] a = str.toCharArray();
        for(int i=0; iif(a[i]<48 || a[i]>57){
                return 0;
            }//一定注意排除不合法的数值表达式
            sum=sum*10+a[i]-48;
        }
        sum=sum*fuhao;
        return sum;
    }
}

解析:这种操作为不正确的操作。
报错:

答案错误:您提交的程序没有通过所有的测试用例
case通过率为91.67%

测试用例:

对应输出应该为:

0

你的输出为:

java.lang.StringIndexOutOfBoundsException: String index out of range: 0

意思应该是substring()函数用的时候出界限了。
当字符串只有一个符号位时,应该输出0的,但是仍然进行了截取,肯定不行。

2.5.2 修正后:

改正思路:加入判断字符串只有符号位的情况。

public class Solution {
    public int StrToInt(String str) {
        if(str=="" || str.length()==0){
            return 0;
        }
        if((str.charAt(0)=='+' || str.charAt(0)=='-') && str.length()==1){//加入判断字符串只有符号位的情况
            return 0;
        }
        int sum=0;
        int fuhao=1;//当第一位为正或无符号时,置符号位为1
        /*if(str.charAt(0)=='-'){
            fuhao=-1;
        }
        if(str.charAt(0)=='+' || str.charAt(0)=='-'){
            str = str.substring(1,str.length());
        }*/
        if(str.charAt(0)=='-'){
            fuhao=-1;//当第一位为符号时,置符号位为-1
            str = str.substring(1,str.length());
        }
        if(str.charAt(0)=='+'){
            str = str.substring(1,str.length());
        }
        char[] a = str.toCharArray();
        for(int i=0; iif(a[i]<48 || a[i]>57){
                return 0;
            }//一定注意排除不合法的数值表达式
            sum=sum*10+a[i]-48;
        }
        sum=sum*fuhao;
        return sum;
    }
}

2.5.2 正确答案

题外话:这个可以通过,不知道为什么,感觉也应该报同样的错,如果只有一个符号位, 不是应该报错越界什么的错误吗?

public class Solution {
    public int StrToInt(String str) {
        if(str=="" || str.length()==0){
            return 0;
        }
        int sum=0;
        int fuhao=1;//当第一位为正或无符号时,置符号位为1
        if(str.charAt(0)=='-'){
            fuhao=-1;
        }
        if(str.charAt(0)=='+' || str.charAt(0)=='-'){
            str = str.substring(1,str.length());
        }
        /*if(str.charAt(0)=='-'){
            fuhao=-1;//当第一位为符号时,置符号位为-1
            str = str.substring(1,str.length());
        }
        if(str.charAt(0)=='+'){
            str = str.substring(1,str.length());
        }*/
        char[] a = str.toCharArray();
        for(int i=0; iif(a[i]<48 || a[i]>57){
                return 0;
            }//一定注意排除不合法的数值表达式
            sum=sum*10+a[i]-48;
        }
        sum=sum*fuhao;
        return sum;
    }
}

觉得应该改成这样的:

public class Solution {
    public int StrToInt(String str) {
        if(str=="" || str.length()==0){
            return 0;
        }
        if((str.charAt(0)=='+' || str.charAt(0)=='-') && str.length()==1){
            return 0;
        }
        int sum=0;
        int fuhao=1;//当第一位为正或无符号时,置符号位为1
        if(str.charAt(0)=='-'){
            fuhao=-1;
        }
        if(str.charAt(0)=='+' || str.charAt(0)=='-'){
            str = str.substring(1,str.length());
        }
        /*if(str.charAt(0)=='-'){
            fuhao=-1;//当第一位为符号时,置符号位为-1
            str = str.substring(1,str.length());
        }
        if(str.charAt(0)=='+'){
            str = str.substring(1,str.length());
        }*/
        char[] a = str.toCharArray();
        for(int i=0; iif(a[i]<48 || a[i]>57){
                return 0;
            }//一定注意排除不合法的数值表达式
            sum=sum*10+a[i]-48;
        }
        sum=sum*fuhao;
        return sum;
    }
}

当然,第二种方法更快一些,不是特别特别清楚为什么。两个算法都是两个if语句判断,都需要进行判断,不知道快是快在了哪???

你可能感兴趣的:(剑指offer)