米哈游(原神)一面笔试原题。。。

最近在网上看到一个帖子,一网友疯狂吐槽米哈游,说米哈游谈的是16薪,等到不想用你的时候就给你打低绩效,只给13薪,然后各种威胁让你主动离职,还不走辞退流程,不给赔偿,真是恶心。

979478d64044c49e2425c8290a000d76.png

其中一网友评论说:不只是米哈游,好多公司都这情况,都已经成普遍了。

c2756faf7456c8448d7770d64ed152f2.png

还有网友说:很多公司都这套路,用年终奖拿捏你,要好你的base就行了,奖金有就是赚了,没有也不在意,你不在意这个他就拿捏不了你。

cac5694740f5f21664c1a03652434302.png

还有一位前米哈游的员工说:我还没拿过低于16的。

41a27940c19570f3973f1b37c067f5fe.png

--------------下面是今天的算法题--------------

看完了网友对米哈游的吐槽,我们再来看一道米哈游的面试题,这是LeetCode的第8题:字符串转换整数 (atoi)。一网友在米哈游面试的时候遇到过这道题,我们可以看到,除了米哈游考过以外,美团和网易也都考过。

261152be433ed06531065f0469763777.png

问题描述

来源:LeetCode第8题

难度:中等

把一个字符串s转化为整数,前面如果有空格要去掉,还要注意正负号,读入下一个字符,直到到达下一个非数字字符或到达输入的结尾,字符串的其余部分将被忽略。

如果整数超过 32 位有符号整数范围 [−2^31,  2^31 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −2^31 的整数应该被固定为 −2^31 ,大于 2^31 − 1 的整数应该被固定为 2^31 − 1 。

示例1:

输入:s = "   -42"

输出:-42

解释:"   -42"(读入前导空格,但忽视掉)

示例2:

输入:s = "4193 with words"

输出:4193

解释:"4193 with words"(读入 "4193";由于下一个字符不是一个数字,所以读入停止),解析得到整数 4193 。

  • 0 <= s.length <= 200

  • s 由英文字母(大写和小写)、数字(0-9)、' '、'+'、'-' 和 '.' 组成

问题分析

这题是让把一个字符串转成一个整数,难度不是很大,但细节挺多,一不小心有可能就会做错。

首先如果字符串前面有空格要去掉,去掉最前面的空格之后如果遇到符号,还要记录符号,如果没有遇到符号就默认是正数。后面开始把字符串转成数字,如果遇到不是数字的直接停止,后面的忽略掉,就不要再转了。还有一点就是转成的数字不能超出int的范围,如果超出了直接截取。

我们需要使用一个变量sign来记录符号位,1表示正数,-1表示负数,转的时候就不需要在考虑符号了,但最后返回的时候还要注意符号不能漏掉。

java:

public int myAtoi(String str) {
    str = str.trim();// 去掉前后的空格
    if (str.length() == 0)
        return 0;
    int num = 0;// 最终结果
    int index = 0;// 遍历字符串中字符的位置
    int sign = 1;// 符号,1是正数,-1是负数,默认为正数
    int length = str.length();
    // 判断符号
    if (str.charAt(index) == '-' || str.charAt(index) == '+')
        sign = str.charAt(index++) == '+' ? 1 : -1;
    for (; index < length; ++index) {
        // 取出字符串中字符,然后转化为数字
        int digit = str.charAt(index) - '0';
        // 按照题中的要求,读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。
        // 字符串的其余部分将被忽略。如果读取了非数字,后面的都要忽略。
        if (digit < 0 || digit > 9)
            break;
        // 越界处理
        if (num > Integer.MAX_VALUE / 10 ||
                (num == Integer.MAX_VALUE / 10 && digit > Integer.MAX_VALUE % 10))
            return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
        else
            num = num * 10 + digit;
    }
    return sign * num;
}

C++:

public:
    int myAtoi(string str) {
        if (str.empty())
            return 0;
        int length = str.size();
        int index = 0;// 遍历字符串中字符的位置
        while (str[index] == ' ')// 去掉前面的空格
            if (++index == length)
                return 0;
        int num = 0;// 最终结果
        int sign = 1;// 符号,1是正数,-1是负数,默认为正数
        // 判断符号
        if (str[index] == '-' || str[index] == '+')
            sign = str[index++] == '+' ? 1 : -1;
        for (; index < length; ++index) {
            // 取出字符串中字符,然后转化为数字
            int digit = str[index] - '0';
            // 按照题中的要求,读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。
            // 字符串的其余部分将被忽略。如果读取了非数字,后面的都要忽略。
            if (digit < 0 || digit > 9)
                break;
            // 越界处理
            if (num > INT_MAX / 10 ||
                (num == INT_MAX / 10 && digit > INT_MAX % 10))
                return sign == 1 ? INT_MAX : INT_MIN;
            else
                num = num * 10 + digit;
        }
        return sign * num;
    }

C:

int myAtoi(char *str) {
    if (strlen(str) == 0)
        return 0;
    int length = strlen(str);
    int index = 0;// 遍历字符串中字符的位置
    while (str[index] == ' ')// 去掉前面的空格
        if (++index == length)
            return 0;
    int num = 0;// 最终结果
    int sign = 1;// 符号,1是正数,-1是负数,默认为正数
    // 判断符号
    if (str[index] == '-' || str[index] == '+')
        sign = str[index++] == '+' ? 1 : -1;
    for (; index < length; ++index) {
        // 取出字符串中字符,然后转化为数字
        int digit = str[index] - '0';
        // 按照题中的要求,读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。
        // 字符串的其余部分将被忽略。如果读取了非数字,后面的都要忽略。
        if (digit < 0 || digit > 9)
            break;
        // 越界处理
        if (num > INT_MAX / 10 ||
            (num == INT_MAX / 10 && digit > INT_MAX % 10))
            return sign == 1 ? INT_MAX : INT_MIN;
        else
            num = num * 10 + digit;
    }
    return sign * num;
}

python:

def myAtoi(self, s: str) -> int:
    s = s.strip()  # 删除首尾空格
    if not s:
        return 0  # 字符串为空则直接返回
    num = 0  # 最终结果
    index = 0  # 遍历字符串中字符的位置
    sign = 1  # 符号,1是正数,-1是负数,默认为正数
    int_max, int_min = 2 ** 31 - 1, -2 ** 31
    if s[index] == '-' or s[index] == '+':
        sign = 1 if s[index] == '+' else -1
        index += 1
    for c in s[index:]:
        digit = ord(c) - ord('0')
        if digit < 0 or digit > 9:
            break  # 遇到非数字的字符则跳出
            # 越界处理
        if num > int_max // 10 or (num == int_max // 10 and digit > int_max % 10):
            return int_max if sign == 1 else int_min
        num = 10 * num + digit
    return sign * num

02cea54647c9e41ac0752d49848840f4.gif

笔者简介

博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解700多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档。

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据结构和算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值