力扣刷题记录[3.1][简单]

本文记录了作者在力扣刷题过程中的思考与总结,从简单题目入手,包括两数之和、回文数、罗马数字转整数等。作者通过题目学习了哈希表、位运算、边界问题等知识点,并分享了遇到的越界问题及解决策略,如使用位移操作避免越界。文章强调了理解和实践的重要性,以及从C/C++到Java的转换中需要注意的问题。
摘要由CSDN通过智能技术生成

一些总结与记录,自查用。
在力扣刷题更多是对学校思维的一种扩宽与转换,太久没刷,先从简单开始,找找感觉。

#1 两数之和
这道题下面很多评论说第一反应还是暴力,我自己也是这样,通过暴力枚举解出结果。学习了题解中使用哈希表解决问题的思路,通过这道题复习了整个关于哈希表的基础知识,很不错。
#9 回文数
第一个想法是将数字转化为字符串,再次中枪。推荐解法是反转数字的一半,在此之前要记得先处理临界情况。
#13. 罗马数字转整数
一道看清本质是比右边数字小就做减法,比右边数字大就做加法,就很简便的题,不然,就只能填写大量的if与elseif……
很有意思的一点是,使用Switch比使用哈希表快很多,评论提到证明在小数据量中哈希表不算占优势。
#剑指 Offer II 001. 整数除法
一个快速熟悉如何讨论32位数边界问题的好题目。
对于一个32位的数x:
− 2 31 < = x < = 2 31 − 1 -2^{31} <= x <= 2^{31}-1 231<=x<=2311
在使用取绝对值代码Math.abs()时,会发现一个问题:

		int x;
        x=Integer.MIN_VALUE;
        System.out.println(Math.abs(x));
		-2147483648

当x的值取最小值时,即使使用取绝对值函数,得到的仍然是负数的最小值。
同样地,假设b=-2147483648, a为任意整数,例如最大值:

        int a,b;
        a=Integer.MAX_VALUE;
        b=Integer.MIN_VALUE;
        System.out.println(a-b);
		-1

即,在Java中,任何一个整数减去最小值,结果都为负数。
这些都是平常没怎么考虑过的关于越界问题的特殊情况,在这道题中学到也算是知识的积累。
另外,本题中其他值得学习的地方则是各类题解,由减法运算至位运算的优化思路,避免产生越界问题而选择的左右位移转化,通过无符号位移取正等。
剑指 Offer II 002. 二进制加法
先说最初思路,将两个二进制字符串转化成十进制,得出结果后再转换回二进制,输出。
Java有十分便利的函数直接实现转化功能。

String toBinaryString(int i)   
//以2为基返回整数参数的字符串表示形式,表示为无符号整数
int parseInt(String s, int radix) 
//以第二个参数指定的基数将字符串参数转换成int

但这个方法有一个最大的问题:越界。

·如果字符串超过 3333 位,不能转化为 Integer
·如果字符串超过 6565 位,不能转化为 Long
·如果字符串超过 500000001500000001 位,不能转化为 BigInteger

方法一:模拟法
这个方法我在写之前也想到过,但因为数学思路并不清晰,没有动手。
核心数学思路是:

对二进制字符串a, b,使用一个变量 c a r r y {carry} carry表示上一个位置的进位,初始值为 0。记当前位置对其的两个位为 a i 和 b i a_i和b_i aibi
则每一位的答案为 ( c a r r y + a i + b i )   m o d   2 ({carry} + a_i + b_i) \bmod{2} (carry+ai+bi)mod2,下一位的进位为 ( c a r r y + a i + b i ) 2 \frac{({carry} + a_i + b_i)}{2} 2(carry+ai+bi),重复上述步骤,直到数字 a 和 b 的每一位计算完毕。最后如果 c a r r y {carry} carry的最高位不为0,则将最高位添加到计算结果的末尾。

简单的复制粘贴显然并不等于理解,最好能拆解一下。
首先,考虑到a,b两个字符串长度并不相同,可以反转字符串对齐,或是补0,也可以直接从最右边开始遍历。
从最右边遍历结束后,放入StringBuilder的顺序是倒着的,因此要记得反转为正!

贴几个看到别人用的小贴士:

int sum += a.charAt(i) - '0';
//通过ASCII码,将字符型数据转换为整型
StringBuilder sb = new StringBuilder();
//其中的reverse()函数,可以直接将此字符序列用其反转形式取代。

从习惯的C/C++转Java,多少都有些不适应的地方,尤其是对象实例的创建,以及常用函数等方面。

学不完啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值