📣小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶 📣python有趣练手项目,可以让你快乐学python练手项目专栏
📣另外想学JavaWeb进厂的同学可以看看这个专栏:传送们 📣这是个面试和考研的算法练习我们一起加油上岸之路
题目
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
函数 myAtoi(string s) 的算法如下:
读入字符串并丢弃无用的前导空格 。 . 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。如果两者都不存在,则假定结果为正。 . 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。 . 将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0。必要时更改符号(从步骤 2 开始)。 . 如果整数数超过 32 位有符号整数范围 [?231, 231 ? 1]需要截断这个整数,使其保持在这个范围内。具体来说,小于 ?231 的整数应该被固定为 ?231 ,大于 231 ? 1 的整数应该被固定为231 ? 1 。 . 返回整数作为最终结果。
注意:
本题中的空白字符只包括空格字符 ' ' 。
除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
示例 1:
输入:s = "42"
输出:42
解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。
第 1 步:"42"(当前没有读入字符,因为没有前导空格)
^
第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
^
第 3 步:"42"(读入 "42")
^
解析得到整数 42 。
由于 "42" 在范围 [-231, 231 - 1] 内,最终结果为 42 。
示例 2:
输入:s = " -42"
输出:-42
解释:
第 1 步:" -42"(读入前导空格,但忽视掉)
^
第 2 步:" -42"(读入 '-' 字符,所以结果应该是负数)
^
第 3 步:" -42"(读入 "42")
^
解析得到整数 -42 。
由于 "-42" 在范围 [-231, 231 - 1] 内,最终结果为 -42 。
示例 3:
输入:s = "4193 with words"
输出:4193
解释:
第 1 步:"4193 with words"(当前没有读入字符,因为没有前导空格)
^
第 2 步:"4193 with words"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
^
第 3 步:"4193 with words"(读入 "4193";由于下一个字符不是一个数字,所以读入停止)
^
解析得到整数 4193 。
由于 "4193" 在范围 [-231, 231 - 1] 内,最终结果为 4193 。
示例 4:
输入:s = "words and 987"
输出:0
解释:
第 1 步:"words and 987"(当前没有读入字符,因为没有前导空格)
^
第 2 步:"words and 987"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
^
第 3 步:"words and 987"(由于当前字符 'w' 不是一个数字,所以读入停止)
^
解析得到整数 0 ,因为没有读入任何数字。
由于 0 在范围 [-231, 231 - 1] 内,最终结果为 0 。
示例 5:
输入:s = "-91283472332"
输出:-2147483648
解释:
第 1 步:"-91283472332"(当前没有读入字符,因为没有前导空格)
^
第 2 步:"-91283472332"(读入 '-' 字符,所以结果应该是负数)
^
第 3 步:"-91283472332"(读入 "91283472332")
^
解析得到整数 -91283472332 。
由于 -91283472332 小于范围 [-231, 231 - 1] 的下界,最终结果被截断为 -231 = -2147483648 。
提示:
0 <= s.length <= 200 s 由英文字母(大写和小写)、数字(0-9)、’ ‘、’+’、’-’ 和 ‘.’ 组成 通过次数323,466提交次数1,494,392
一点点思路
刚看到这个题(我的心里,好家伙题目这么常不想写了肯定很难),不知道大家有没有这样想,哈哈哈。仔细看完如果你看了之前几篇例题的话这道题简直张飞吃豆芽——小菜一碟,所以大家知道了我们一块刷题的重要性了吧。不信的话我们往下看,去验证是不是都是以前做的方法。
开干
常规介绍一种函数
之前介绍的StringBuilder() 和toCharArray() 在这里都有用到哦。今天给大家介绍的函数是Math 函数他作为一种数学函数适用范围还是挺广的,我们看看他有那些功能吧。
Math.PI 记录的圆周率
Math.E 记录e的常量
Math中还有一些类似的常量,都是一些工程数学常用量。
Math.abs 求绝对值
Math.sin 正弦函数 Math.asin 反正弦函数
Math.cos 余弦函数 Math.acos 反余弦函数
Math.tan 正切函数 Math.atan 反正切函数 Math.atan2 商的反正切函数
Math.toDegrees 弧度转化为角度 Math.toRadians 角度转化为弧度
[color=red]Math.ceil 得到不小于某数的最大整数 比它大的数[/color]
[color=red]Math.floor 得到不大于某数的最大整数 比它小的数[/color]
Math.IEEEremainder 求余
Math.max 求两数中最大
Math.min 求两数中最小
Math.sqrt 求开方
[color=red]Math.pow 求某数的任意次方, 抛出ArithmeticException处理溢出异常[/color]
Math.exp 求e的任意次方
Math.log10 以10为底的对数
Math.log 自然对数
Math.rint 求距离某数最近的整数(可能比某数大,也可能比它小)
[color=red]Math.round 求距离某数最近的整数,返回int型或者long型(上一个函数返回double型)[/color]
Math.random 返回0,1之间的一个随机数
源码及分析
public class test {
public static String myAtoi(String s) {
char[] list=s.toCharArray();
StringBuilder lis=new StringBuilder();
for(int i=0;i<list.length;i++) {
if(list[i]==' ') {
continue;
}
else if(list[i]=='+'||list[i]=='-'||(Integer.valueOf(list[i])>=48&&Integer.valueOf(list[i])<=57)) {
lis.append(list[i]);
}else {
return lis.toString();
}
}
return lis.toString();
}
public static void main(String[] args) {
long a=Integer.parseInt(myAtoi("words and 987")==""? "0":myAtoi("words and 987"));
int b= (int) Math.max(Math.min(a, Math.pow(2, 31)-1), Math.pow(-2, 31));
System.out.println(b);
}
}
当然这是我自己的格式写的,没有按官方的格式。来吧我们开始逐一解释:
public static String myAtoi(String s) {
char[] list=s.toCharArray();
StringBuilder lis=new StringBuilder();
for(int i=0;i<list.length;i++) {
if(list[i]==' ') {
continue;
}
else if(list[i]=='+'||list[i]=='-'||(Integer.valueOf(list[i])>=48&&Integer.valueOf(list[i])<=57)) {
lis.append(list[i]);
}else {
return lis.toString();
}
}
return lis.toString();
}
else if(list[i]=='+'||list[i]=='-'||(Integer.valueOf(list[i])>=48&&Integer.valueOf(list[i])<=57)) {
lis.append(list[i]);
这个部分是判断+ 和- 还有每个字符的ascll值准备的Integer.valueOf() 就是计算ascll值的函数,只要在0-9之间的数都满足。
else if(list[i]=='+'||list[i]=='-'||(list[i]>='0'&&list[i]<='9')) {
lis.append(list[i]);
接着我们就剩下了主函数部分,这部分在提交的时候要变换的只不过我在写讲解的时候要用到就没有按照官方的那种格式。
public static void main(String[] args) {
long a=Integer.parseInt(myAtoi("words and 987")==""? "0":myAtoi("words and 987"));
int b= (int) Math.max(Math.min(a, Math.pow(2, 31)-1), Math.pow(-2, 31));
System.out.println(b);
好了今天的算法题就到这里,你学会了吗?总的来说这道题对我们前面几道题进行了回忆,如果你没想起来建议去看看。学过的不能忘了。
|