携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情
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即可