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

 更新时间:2021年08月18日 14:09:56   作者:肥学  
这篇文章主要介绍了Java函数与算法Math函数总结与字符串转换整数,每天练一练,水平在不知不觉中提高,需要的朋友快过来看看吧

题目

请你来实现一个 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' 不是一个数字,所以读入停止)
示例 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的功能我就不介绍了吧,够基础的了
				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"));
  //就是上面说的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函数与算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java雪花算法的实现详解

    Java雪花算法的实现详解

    雪花算法(Snowflake)是一种分布式唯一ID生成算法,用于生成全局唯一的ID,使用雪花算法生成的ID通常是一个64位的整数,可以根据需要进行转换和展示,在Java等编程语言中,可以使用相应的库或工具来生成雪花算法的ID,本文给大家介绍了Java雪花算法的实现
    2023-11-11
  • Java中的WeakHashMap源码分析

    Java中的WeakHashMap源码分析

    这篇文章主要介绍了Java中的WeakHashMap源码分析,WeakHashMap可能平时使用的频率并不高,但是你可能听过WeakHashMap会进行自动回收吧,下面就对其原理进行分析,需要的朋友可以参考下
    2023-09-09
  • 使用注解解决ShardingJdbc不支持复杂SQL方法

    使用注解解决ShardingJdbc不支持复杂SQL方法

    这篇文章主要为大家介绍了使用注解解决ShardingJdbc不支持复杂SQL方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Java如何在命令行中获取指定数据

    Java如何在命令行中获取指定数据

    这篇文章主要介绍了Java如何在命令行中获取指定数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 微信跳一跳刷分java代码实现

    微信跳一跳刷分java代码实现

    这篇文章主要介绍了微信跳一跳刷分java代码实现,还为大家分享了java刷微信跳一跳问题集,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 基于SpringBoot多线程@Async的使用体验

    基于SpringBoot多线程@Async的使用体验

    这篇文章主要介绍了SpringBoot多线程@Async的使用体验,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • idea创建maven项目速度慢的三种解决方案

    idea创建maven项目速度慢的三种解决方案

    这篇文章主要介绍了idea创建maven项目速度慢的三种解决方案,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • MVC页面之间参数传递实现过程图解

    MVC页面之间参数传递实现过程图解

    这篇文章主要介绍了MVC页面之间参数传递实现过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java中Redis的布隆过滤器详解

    Java中Redis的布隆过滤器详解

    这篇文章主要介绍了Java中Redis的布隆过滤器详解,我们经常会把一部分数据放在Redis等缓存,比如产品详情,这样有查询请求进来,我们可以根据产品Id直接去缓存中取数据,而不用读取数据库,这是提升性能最简单,最普遍,也是最有效的做法,需要的朋友可以参考下
    2023-09-09
  • Java通俗易懂系列设计模式之策略模式

    Java通俗易懂系列设计模式之策略模式

    这篇文章主要介绍了Java通俗易懂系列设计模式之策略模式,对设计模式感兴趣的同学,一定要看一下
    2021-04-04

最新评论