剑指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. 通过String(i)⽅法转换:利⽤ String s = String(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码值见
1.3 其它⼩知识点:将字符串转换为字符数组
1. CharArray() ⽅法 ,作⽤:将字符串转换为字符数组。
2. String.charAt(int index)⽅法:返回下标为index处的字符,利⽤for循环,实现将字符串存放到数组中。
3. String.substring(int beginIndex,int endIndex)⽅法:返回索引位置从beginIndex(包括)到endIndex(不包括)的⼦串,利⽤for循环,实现将
字符串存放到数组中。
例⼦:
1)CharArray() ⽅法:将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;i<str.length();i++){
chs[i]=str.charAt(i);
System.out.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 = Line();
System.out.println(s);
打印出来的是” hello”;
Scanner scanner = new Scanner(System.in);
String s = ();
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.length; i++){
arr[i] = a.substring(i, (i+1));
}//最后输出数组就可以了。System.out.println(java.String[arr]);
2 题⽬描述
将⼀个字符串转换成⼀个整数,要求不能使⽤字符串转换整数的库函数。 数值为0或者字符串不是⼀个合法的数值则返回0
2.1 输⼊描述:
输⼊⼀个字符串,包括数字字母符号,可以为空
2.2 输出描述:
如果是合法的数值表达则返回该数字,否则返回0
2.3 ⽰例1
数组转换成字符串输⼊
+2147483647
1a33
输出
2147483647
2.4 题⽬分析
边界条件:空字符串,字符串长度为0;
2.5 我的答案
2.5.1 错误答案
}
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 = CharArray();
for(int i=0; i<a.length; i++){
if(a[i]<48 || a[i]>57){
return0;
}//⼀定注意排除不合法的数值表达式
sum=sum*10+a[i]-48;
}
sum=sum*fuhao;
return sum;
}
}
解析:这种操作为不正确的操作。
报错:
答案错误:您提交的程序没有通过所有的测试⽤例
case通过率为91.67%
测试⽤例:
对应输出应该为:
你的输出为:
java.lang.StringIndexOutOfBoundsException: String index out of range: 0
意思应该是substring()函数⽤的时候出界限了。
当字符串只有⼀个符号位时,应该输出0的,但是仍然进⾏了截取,肯定不⾏。2.5.2 修正后:
改正思路:加⼊判断字符串只有符号位的情况。
}
if((str.charAt(0)=='+' || str.charAt(0)=='-') && str.length()==1){//加⼊判断字符串只有符号位的情况
return0;
}
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 = CharArray();
for(int i=0; i<a.length; i++){
if(a[i]<48 || a[i]>57){
return0;
}//⼀定注意排除不合法的数值表达式
sum=sum*10+a[i]-48;
}
sum=sum*fuhao;
return sum;
}
}
2.5.2 正确答案
题外话:这个可以通过,不知道为什么,感觉也应该报同样的错,如果只有⼀个符号位, 不是应该报错越界什么的错误吗?
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论