7. 整数反转
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
解法一
- 取最后一位数 + result * 10即可反转
- 考虑到负数,循环结束的条件应该是 x != 0,而不是 x<0
- 题目要求不允许存储64位数据,int为4字节,long为8字节,即不可以定义long型数据
- java发生溢出不会报错,但是数据会发生变化,因此判断溢出的方法可以是将得到的数再除以10,看是否与原数相等,若相等则未溢出,不相等则溢出返回0
解法二
- 先把特殊情况考虑出来,即再加是否会导致溢出
8. 字符串转换整数
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
函数 myAtoi(string s) 的算法如下:
读入字符串并丢弃无用的前导空格
检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
返回整数作为最终结果。
注意:
本题中的空白字符只包括空格字符 ’ ’ 。
除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
解法
- 先判断是否溢出再加到result上
- 溢出的两种可能:【-512,511) (每次都是乘以10,因此溢出位为最后一位或者第二位)
- 1)516在最后一位发生溢出,此时result = 51, 且 6 > 1
- 2)521在倒数第二位发生溢出,此时result=52,直接判断MAX_VALUE / 10 与result的大小关系即可
- -19 / 10 = -1
- -19 % 10 = -9
9. 回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
解法
- 如果是负数,则直接返回false
- 如果是正数,则比较该数倒置后得到的数是否与原数相同,如果溢出则直接返回false
10. 正则表达式匹配
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
‘.’ 匹配任意单个字符
‘*’ 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
解法
11. 盛最多水的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
解法
- 采用双指针的方式,从两侧遍历数组
- 左指针对应数值小时左指针右移,右指针对应数值小时右指针左移
- 直至左右指针相遇停止循环
- 当左指针小时,以左指针为边界的容器其所能达到的最大容量以求,因此之后不再考虑该指针为边界
12. 整数转罗马数字
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给你一个整数,将其转为罗马数字。
解法
- 利用符号表表示所有符号
- 从符号表中最大的数开始循环,只要可以分解出一个大数对应的符号就添加到StringBuffer类中,添加完之后用num减掉大数