每天练一练Java函数与算法Math函数总结与字符串转换整数

时间:2022-05-20 02:16:37

题目

请你来实现一个 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
2
3
4
5
注意:
 
本题中的空白字符只包括空格字符 ' '
除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
示例 1
 
输入:s = "42"
输出:42
解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。
1 步:"42"(当前没有读入字符,因为没有前导空格)
         ^
2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+'
         ^
3 步:"42"(读入 "42"
           ^
解析得到整数 42
由于 "42" 在范围 [-231, 231 - 1] 内,最终结果为 42
?
1
2
3
4
5
6
7
8
9
10
11
12
13
示例 2
 
输入:s = "   -42"
输出:-42
解释:
1 步:"   -42"(读入前导空格,但忽视掉)
            ^
2 步:"   -42"(读入 '-' 字符,所以结果应该是负数)
             ^
3 步:"   -42"(读入 "42"
               ^
解析得到整数 -42
由于 "-42" 在范围 [-231, 231 - 1] 内,最终结果为 -42
?
1
2
3
4
5
6
7
8
9
10
11
12
13
示例 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
?
1
2
3
4
5
6
7
8
9
10
示例 4
 
输入:s = "words and 987"
输出:0
解释:
1 步:"words and 987"(当前没有读入字符,因为没有前导空格)
         ^
2 步:"words and 987"(当前没有读入字符,因为这里不存在 '-' 或者 '+'
         ^
3 步:"words and 987"(由于当前字符 'w' 不是一个数字,所以读入停止)
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
示例 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函数他作为一种数学函数适用范围还是挺广的,我们看看他有那些功能吧。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 返回01之间的一个随机数

源码及分析

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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);
        
    }
 
}

当然这是我自己的格式写的,没有按官方的格式。来吧我们开始逐一解释:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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之间的数都满足。

  • 其实应该可以直接写成这种形式
?
1
2
else if(list[i]=='+'||list[i]=='-'||(list[i]>='0'&&list[i]<='9')) {
                lis.append(list[i]);

接着我们就剩下了主函数部分,这部分在提交的时候要变换的只不过我在写讲解的时候要用到就没有按照官方的那种格式。

?
1
2
3
4
5
6
7
8
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);

 好了今天的算法题就到这里,你学会了吗?总的来说这道题对我们前面几道题进行了回忆,如果你没想起来建议去看看。学过的不能忘了。

到此这篇关于每天练一练Java函数与算法Math函数总结与字符串转换整数的文章就介绍到这了,更多相关Java函数与算法内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/jiahuiandxuehui/article/details/119521946