LeetCode-Algorithms-8.字符串转换为整数 (atoi)

这篇博客主要解析LeetCode中8号问题——如何将字符串转换为整数(atoi)。内容涵盖题目描述、提交记录、算法思路和C语言代码实现。算法核心在于判断字符串的合法性,处理前导空格、正负符号以及防止整数溢出的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/* 1. 题目描述 */
请你来实现一个 atoi 函数,使其能将字符串转换成整数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。

当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。

注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0。

说明:

假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−2^31^,  2^31^ − 1]。如果数值超过这个范围,请返回  INT_MAX (2^31^ − 1) 或 INT_MIN (−2^31^) 。

示例:

示例 1:
			输入: "42"
			输出: 42
示例 2:
			输入: "   -42"
			输出: -42
			解释: 第一个非空白字符为 '-', 它是一个负号。我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
示例 3:
			输入: "4193 with words"
			输出: 4193
			解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。
示例 4:	
			输入: "words and 987"
			输出: 0
			解释: 第一个非空字符是 'w', 但它不是数字或正、负号。因此无法执行有效的转换。
示例 5:	
			输入: "-91283472332"
			输出: -2147483648
			解释: 数字 "-91283472332" 超过 32 位有符号整数范围。因此返回 INT_MIN (−2^31) 。
/* 2. 提交记录 */

字符串转换整数

/* 3. 算法思想 */

由题目可知,最终的return 值有两种,return 0;和return 整数。
(1)当char *str 为空字符串时;
(2)当char *str 仅包含空白字符时;
(3)当char *str 的第一个非空字符是“+”或“-”,紧接着的第二个非空字符不是整数时;
以上三种情况 return 0。下面来说return 整数的情况:
(1)当char *str 的开头有无用的空格字符,要一直寻找到第一个非空字符;
(2)当char *str 的第一个非空字符是“+”或“-”,紧接着第二位非空字符必须是整数;
(3)当char *str 的满足第(2)种情况,或者第一个非空字符是数字。此时需要考虑转换后的整数result是否会溢出,当result超过此[−231, 231 − 1]数值范围,返回INT_MAX (231 − 1) 或 INT_MIN (−231)。

/* 4. 代码实现 */

	int myAtoi(char * str){
	    int i = 0 , result = 0;
	    bool flag = true;
	    if(str == NULL){            /*1.字符串为空*/
	        return 0;
	    }
	    while(*(str+i) != '\0'){
	        if(isspace(*(str+i)) ){  /* 如果 *(str+i) 是空白字符,i++,寻找下一个非空白字符 */
	            i++;
	        }else{break;}
	    }
	    if(i < strlen(str) ){       /*如果字符串str找到了第一个非空字符*(str+i);*/
	        
	        if( *(str+i) == '-'){
	            flag = false; 
	            if(*(str+i+1) == '-'||*(str+i+1) == '+'){ return 0;}
	            if('0' <= *(str+i+1) && *(str+i+1) <= '9'){ i++ ;}
	        }
	        if( *(str+i) == '+'){
	            flag = true;
	            if(*(str+i+1) == '-'||*(str+i+1) == '+'){return 0;}
	            if('0' <= *(str+i+1) && *(str+i+1) <= '9'){i++;} 
	        } 
	        
	        printf("%d ",result);    
	        int temp = INT_MAX/10;
	        while( '0' <= *(str+i) && *(str+i) <= '9' && i < strlen(str)){
	            
	            if(!flag && ((result == temp && *(str+i)-48 >= 8)||(result > temp))){
	                return INT_MIN;                
	            }
	            if(flag && ((result == temp && *(str+i)-48 >= 7)||(result > temp))){
	                return INT_MAX;
	            }
	            
	            result = result * 10 + (*(str+i)-48) ; /*数字0~9对应的ASCII码为48~57*/
	            i++;
	            
	        }
	        return !flag ? -result : result;
	    }else{                      /* 字符串str仅包括空白字符 */
	        return 0;
	    }
	}
	

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值