首页 > 其他分享 >【剑指offer】

【剑指offer】

时间:2024-07-30 19:57:30浏览次数:17  
标签:offer INT int 123 str test atoi

剑指offer

面试题67:字符串转成整数

LeedCode:LCR 192. 把字符串转换成整数 (atoi)

测试atoi的功能和异常效果

#include <iostream>
#include <cstdlib>

using namespace std;
//测试atoi的各项功能
//atoi:将数字字符串转换成int类型的整数
void test_atoi(const char *str,int expectd)
{
    int ret = atoi(str);
    if(ret == expectd)
    {
        cout<<"Test passed:atoi("<<str<<") = "<<ret<<endl;
    }
    else
    {
        cout<<"Test failed:atoi("<<str<<") = "<<ret<<endl;
    }
}

int main()
{
    //正数 负数 0
    test_atoi("123",123);
    test_atoi("-123",-123);
    test_atoi("0",0);

    //边界
    test_atoi("2147483647",2147483647); //INT_MAX
    test_atoi("-2147483648",-2147483648); //INT_MIN

    //非法输入
    test_atoi("",0);
    test_atoi("abc",0);
    test_atoi("123abc",123);
    test_atoi("abc123",0);

    //混合输入
    test_atoi("123 ",123);
    test_atoi(" 123",123);
    test_atoi(" -123",-123);
    test_atoi("-123 ",-123);

    //溢出 --有符号的上溢和下溢
    test_atoi("2147483656",21474836456);
    test_atoi("-2147483660",-2147483660);
    system("pause");
    return 0;
}

运行效果:
在这里插入图片描述
溢出这里atoi函数的操作和LeedCode上的要求不一样,LeedCode上简化了要求,如果上溢那就输出最大的正整数,如果下溢那就输出最小的负整数,具体的计算机溢出可以参照这篇文章:整数溢出详解

计算机中有 4 种溢出情况,以 32 位整数为例。

① 无符号上溢:无符号数 0xffffffff 加 1 会变成 0。

② 无符号下溢:无符号数 0 减去 1 会变成 0xffffffff,即-1。

③ 有符号上溢:有符号正数 0x7fffffff 加 1 变成 0x80000000, 即从 2147483647 变成了-2147483648。

④ 有符号下溢:有符号负数 0x80000000 减去 1 变成 0x7fffffff,即从-2147483648 变成了 2147483647。

因此实现把一个字符串转换成整数这个问题,需要考虑以下几点

  1. ““和” “和"0”,三种情况输出的都是0,实际上是有区别的,按照书上说的,atoi是通过全局变量来区分的,如果是非法输入,返回0并把这个全局变量设为一个特殊标记,如果输入是"0”,则返回0,不会设置全局变量,可以通过检查全局变量来查看是非法输入还是字符串"0"
  2. 正负号的判断,正负号占一个位置,并且正负号后应当紧接着就是数字,否则也是非法输入,相当于还是识别到了" "
  3. 溢出,int类型是4字节,取值范围是INT_MAX:2147483647 INT_MIN:-2147483648,这个宏定义在<limits.h>这个头文件里,可以包含然后直接用

这里提供了满足LeedCode上要求的代码,其实还有合法非法,以及溢出问题没有考虑到
下面是用C++实现的代码,

class Solution {
public:
    int myAtoi(string str) {
        int res = 0,bndry = INT_MAX/10;
        int i = 0,sign = 1,len = str.size();
        if(len == 0) return 0; //空字符串
        while(str[i] == ' ')
        {
            if(++i == len) return 0; //空格后面全是空格
        }
        if(str[i] == '-') sign = -1; //负号
        if(str[i] == '+' || str[i] == '-') i++; //正号或负号
        for(int j = i;j<len;j++)
        {
            if(str[j] <'0' || str[j] >'9') break; //非数字字符
            //int类型:INT_MAX:2147483647 INT_MIN:-2147483648,尾数为7和8
            if(res > bndry || res == bndry && str[j] >'7')
            {
                return sign == 1 ? INT_MAX : INT_MIN; //溢出
            }
            res = res*10 + (str[j]-'0');
        }
        return sign*res; 
    }
};

用C实现的代码:

int myAtoi(char* str) {
    assert(str); //空指针判断
    if (*str == '\0') //空串判断
        return 0;
    while (isspace(*str)) { //清除空格
        str++;
    }
    int sign = 1; //判断正负号
    if (*str == '-')
        sign = -1;
    if (*str == '+' || *str == '-')
        str++;
    int ret = 0, bon = INT_MAX / 10;
    while (*str != '\0') {
        if (*str < '0' || *str > '9')
            break;
        if (ret > bon || ret == bon && *str > '7') { //溢出判断
            return sign == 1 ? INT_MAX : INT_MIN;
        }
        ret = ret * 10 + (*str - '0');
        str++;
    }
    return sign * ret;
}

书上的代码:

面试题1:赋值运算符函数

class CMyString
{
public:
	CMyString(char* pData = nullptr);
	CMyString(const CMyString& str);
	~CMyString(void);
private:
	char* m_pData;
};

面试题3:数组中重复的数字

LeedCode:442. 数组中重复的数据

标签:offer,INT,int,123,str,test,atoi
From: https://blog.csdn.net/m0_44965777/article/details/140789961

相关文章

  • 剑指Offer题解合集
    剑指Offer题单及题解题目顺序为牛客上剑指Offer专题JZ3、数组中重复的数字分析可以直接对数组进行排序,通过判断首末数字大小来判断数字越界情况,注意数组为空的情况。发现\(0\leqnums[i]\leqn-1\),因此直接开一个数组判断是否有重复数字即可,返回第一个重复数字。代码......
  • 数据结构与算法,剑指Offer 50题
    队列队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。对列的添加insertappend队列的取值列表[-1]列表[0]队列的删......
  • 大专学历,快 30 岁,裁员 2 个月,拿到 25k+ 的 Offer,优秀!!.md
    大家好,我是R哥。最近做面试辅导,帮到了太多小伙伴入职了,大多都是统招「二本」及以上学历,其实也有好几个「大专」、「专升本」学历辅导入职的案例。比如我今天要分享的这个激动人心的面试辅导成功案例,这兄弟我管他叫「小王」好了,小王他就是大专学员:小王也算是我的铁粉,在裁员一周......
  • 社招——4个offer
    写在前面的话2024年4月30日,公司开始了大裁员,原因是经营状态不好+更换CEO,我被裁了,给了n+2。被裁后心情跌至谷底,有很多疑惑和愤怒的情感,明明我这么优秀,还刚升职,为什么把我裁了。但更多的是茫然,休息了两周左右,我应该去向何方呢?当时刷了下招聘软件,发现大部分都只招3年经验的开发,......
  • 大模型算法方向实习会经常提问哪些问题?看完手撕面试官拿下offer!
    现互联网研发一枚,曾拿过多个算法/研发岗SPoffer,简要介绍一下大模型算法岗面试内容和如何准备面试。大模型算法岗的面试内容,实际上可以拆解成两部分,一是算法岗通用的面试内容,二是大模型专有相关部分。算法岗通用面试内容这部分内容很重要,因为通用的面试内容可以适用于不同......
  • 手工转测试开发成功秘籍揭秘:从裁员到入职18k+,收获4个Offer,道阻且长不怯步
    我之前是在一家金融公司工作,每天过得很安逸,同事也很互助和友爱,但是我的工作能力方面却一直没有很大的提升。大部分工作时间都是在做功能测试,每个季度会有一个接口自动化的考核目标。正是因为这样的环境,我开始意识到这是一个温水煮青蛙的环境,如果我一直维持现状,离开这家公司时,不论......
  • 【剑指offer】JZ23-链表中环的入口节点-Python解法
    1.题目描述2.解题思路(Python版)方法:双指针法思路:根据题目描述,需要找到一个链表环的入口节点,这个题目可以拆分成三个小问题:(1)如何确定一个链表中是否包含环?(2)如果有环,环中节点的数目如何计算?(3)如何找到环的入口?接下来分别解决上述三个问题:(1)如何确定一个链表中是否包含环:有......
  • 【剑指offer】JZ22-链表中倒数第k个节点-Python解法
    1.题目描述2.解题思路(Python版)方法一:遍历两次思路:1.首先计算链表的长度L;2.第二次开始从头依次遍历,找到链表的第(L-k+1)个节点,即为所找的节点。参考代码:#classListNode:#def__init__(self,x):#self.val=x#self.next=None##代码中的......
  • 又跳槽!3年java经验offer收割机的面试心得
    中厂->阿里->字节,成都->杭州->成都系列文章目录和关于我0.前言笔者在不足两年经验的时候从成都一家金融科技中厂跳槽到杭州阿里淘天集团,又于今年5月份从杭州淘天跳槽到成都字节。自认为自己在面试这方面有一点心得,处于记录和分享的目的便有了此文,此文纯主观,也许对3年社招的同学......
  • 剑指offer2
    目录面试题1:赋值运算符函数面试题2:实现单例模式面试题3:二维数组中的查找面试题4:替换空格面试题5:从尾到头打印链表本系列面试题来自《剑指offer》第二版,以c/c++实现,代码在g++11.4.0均运行通过面试题1:赋值运算符函数本题考察实现自己的string类#include<iostream>#include......