用户名
Email
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
帖子
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
数据库
›
Mysql
›
每日算法之把字符串转换成整数(atoi)
每日算法之把字符串转换成整数(atoi)
钜形不锈钢水箱
论坛元老
|
2022-12-29 16:12:42
|
显示全部楼层
|
阅读模式
楼主
主题
1944
|
帖子
1944
|
积分
5832
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
JZ67 把字符串转换成整数(atoi)
题目
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。传入的字符串可能有以下部分组成:
1.若干空格
2.(可选)一个符号字符('+' 或 '-')
3. 数字,字母,符号,空格组成的字符串表达式
4. 若干空格
转换算法如下:
1.去掉无用的前导空格
2.第一个非空字符为+或者-号时,作为该整数的正负号,如果没有符号,默认为正数
3.判断整数的有效部分:
3.1 确定符号位之后,与之后面尽可能多的连续数字组合起来成为有效整数数字,如果没有有效的整数部分,那么直接返回0
3.2 将字符串前面的整数部分取出,后面可能会存在存在多余的字符(字母,符号,空格等),这些字符可以被忽略,它们对于函数不应该造成影响
3.3 整数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231的整数应该被调整为 −231 ,大于 231 − 1 的整数应该被调整为 231 − 1
4.去掉无用的后导空格
复制代码
方法 位运算
思路
算法实现
既然是将字符串转化为数字,那我们可以遍历字符串,一个字符串,一个字符地检查,然后取出掉无用的,取出数字,利用如下代码,一个数字一个数字地转换,前面的扩大十倍加上后面一位。
res = res * 10 + sign * (c - '0');
具体做法:
step 1:遍历字符串,用index记录全程的下标。
step 2:首先要排除空串,然后越过前导空格,以及前导空格后什么都没有就返回0.
step 3:然后检查符号,没有符号默认为正数。
step 4:再在后续遍历的时候,将数字字符转换成字符,遇到非数字则结束转换。
step 5:与Int型最大最小值比较,检查越界情况。
复制代码
代码
package mid.JZ67把字符串转换成整数;
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return int整型
*/
public int StrToInt (String s) {
// write code here
if (s.isEmpty()) return 0;
int res = 0;
int index = 0;
while(index < s.length()) {
if (s.charAt(index) == ' ')
index++;
else
break;;
}
//去掉空格就没了
if (index == s.length()) return 0;
int sign = 1;
//处理第一个符号是正负号的情况
if (s.charAt(index) == '+')
index++;
else if (s.charAt(index) == '-'){
sign = -1;
index++;
}
//去掉符号就什么都没有了
if(index == s.length())
return 0;
while(index < s.length()) {
char c = s.charAt(index);
if (c < '0' || c > '9') {
break;
}
//处理越界
if(res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && (c - '0') > Integer.MAX_VALUE % 10))
return Integer.MAX_VALUE;
if(res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && (c - '0') > -(Integer.MIN_VALUE % 10)))
return Integer.MIN_VALUE;
res = res * 10 + sign * (c - '0');
index++;
}
return res;
}
}
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
钜形不锈钢水箱
论坛元老
这个人很懒什么都没写!
楼主热帖
Linux——环境基础开发工具的使用 ...
详细介绍如何在ubuntu20.04中安装ROS系 ...
Android Studio第12课关于databinding ...
架构师说低代码:走出半生,归来仍是“ ...
HCIA学习笔记四:华为设备登录信息 ...
Android Studio实现音乐播放器2.0 ...
【小程序专栏】多种开发方式对比-跨端 ...
SAP FICO+MM测试环境
Jenkins发布uniapp开发的H5遇到的问题 ...
在Web前端基于CAD图实现等值线在线分析 ...
标签云
AI
运维
CIO
存储
服务器
快速回复
返回顶部
返回列表