LeetCode之一篇文章带你看懂回文数及字符串转化

263 阅读3分钟

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

LeetCode 9

题目

image.png

思路分析

(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(见下图) image.png

(4)此时x /= 10revertedNumber,由于是奇数位置,故中间位置的数字对回文数字不会产生任何影响(x/10不会影响到跟回文数有关的数字,比如123/10 = 12,对123的回文数321不会产生任何影响/10的目的只是为了排除中间数字

(5)最终跳出while循环,此时分两种情况

当x为偶数时候,直接返回revertedNumber即可

当x为奇数时候,在/10的基础上返回即可,具体原因见(4)

LeetCode 13

题目

image.png

思路分析

(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即可