LeetCode 9
题目
思路分析
(1)首先看到这个题目的时候,我的第一反应即运用/
和%
对数据进行处理,同时也想过反转链表的方式来对该数字进行比较
(2)接着要考虑到负数不可行且回文数的特殊性质(如首位为0)
代码实现
class Solution { public boolean isPalindrome(int x) { if (x < 0 || (x % 10 == 0 && x != 0)) { return false; } int revertedNumber = 0; while (x > revertedNumber) { revertedNumber = revertedNumber * 10 + x % 10; x /= 10; } return x == revertedNumber || x == revertedNumber / 10; } }
代码详解
(1)首先判断该数字是否为负数,如果为负数,则立即返回false
(该方法是Boolean
类型的方法)
(2)接着判断该数字是否为10的整数倍,如果为10的整数倍,则表明该数字的开头也要为0,同时满足这两个条件的只有0,又因为回文数必须是正数,所以不满足条件。综上面两个条件所述,满足其一则将返回false
(3)定义一个变量revertedNumber
用于表达反转后的数字,当x
(原数字)> revertedNumber
(反转后的数字)时候,表明该反转后的数字需要 x * 10 + x % 10
(见下图)
(4)此时x /= 10
指revertedNumber
,由于是奇数位置,故中间位置的数字对回文数字不会产生任何影响(x/10
不会影响到跟回文数有关的数字,比如123/10 = 12
,对123
的回文数321
不会产生任何影响,/10
的目的只是为了排除中间数字)
(5)最终跳出while
循环,此时分两种情况
① 当x为偶数时候,直接返回revertedNumber
即可
② 当x为奇数时候,在/10
的基础上返回即可,具体原因见(4)
LeetCode 13
题目
思路分析
(1)看到这一题我的第一反应即为拼接字符串,但是考虑到字符串大小的问题,传统意义上的字符串并不能真正解决这一题的问题(因为有变号),所以我想到了charAt()
对元素进行索引查找,
代码实现
import java.util.*; class Solution { public int romanToInt(String s) { int sum = 0; int preNum = getValue(s.charAt(0)); for(int i = 1;i < s.length(); i ++) { int num = getValue(s.charAt(i)); if(preNum < num) { sum -= preNum; } else { sum += preNum; } preNum = num; } sum += preNum; return sum; } private int getValue(char ch) { switch(ch) { case 'I': return 1; case 'V': return 5; case 'X': return 10; case 'L': return 50; case 'C': return 100; case 'D': return 500; case 'M': return 1000; default: return 0; } } }
代码详解
(1)首先我们定义一个private
权限,int
类型的getvalue
方法,并传入一个参数ch
作为switch
循环的接收变量。根据题目要求分别进行case
分支与break
操作
(2)首先我们定义一个sum
变量用于输出最终的数字,定义preNum
变量用于获取用户输入的罗马数字所对应的值。使用for循环对用户输入的罗马数字进行遍历,定义一个num
变量用于调用getValue
方法对i
进行处理。
(3)如果用户输入的值小于罗马数字中定义的数值,则变号(具体详见题目规则),反之不变号,赋值即可
(4)最终将用户所输入的罗马数字值进行相加,return sum
即可