这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战java
请你来实现一个 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 。 . 返回整数做为最终结果。markdown
注意:
本题中的空白字符只包括空格字符 ' ' 。
除前导空格或数字后的其他字符串外,请勿忽略 任何其余字符。
复制代码
示例 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 。
复制代码
提示:app
0 <= s.length <= 200 s 由英文字母(大写和小写)、数字(0-9)、' '、'+'、'-' 和 '.' 组成 经过次数323,466提交次数1,494,392dom
刚看到这个题(个人内心,好家伙题目这么常不想写了确定很难),不知道你们有没有这样想,哈哈哈。仔细看完若是你看了以前几篇例题的话这道题简直张飞吃豆芽——小菜一碟,因此你们知道了咱们一块刷题的重要性了吧。不信的话咱们往下看,去验证是否是都是之前作的方法。函数
以前介绍的StringBuilder()
和toCharArray()
在这里都有用到哦。今天给你们介绍的函数是Math
函数他做为一种数学函数适用范围仍是挺广的,咱们看看他有那些功能吧。post
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);
}
}
复制代码
固然这是我本身的格式写的,没有按官方的格式。来吧咱们开始逐一解释:ui
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的功能我就不介绍了吧,够基础的了
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之间的数都知足。url
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"));
//就是上面说的Math函数的主要用法,由于答案要判断范围
//因此咱们先让咱们求出来的数和上界(2^31)-1比找最小的
//再和-2^31比找最大的得出来的数就是咱们要找的,不懂能够私信或者评论给详解
int b= (int) Math.max(Math.min(a, Math.pow(2, 31)-1), Math.pow(-2, 31));
System.out.println(b);
复制代码
好了今天的算法题就到这里,你学会了吗?总的来讲这道题对咱们前面几道题进行了回忆,若是你没想起来建议去看看。学过的不能忘了。