当前位置:   article > 正文

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

米哈游笔试题

最近在网上看到一个帖子,一网友疯狂吐槽米哈游,说米哈游谈的是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:

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

C++:

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

C:

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

python:

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

02cea54647c9e41ac0752d49848840f4.gif

笔者简介

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

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号