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

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

LeetCode 9


题目


1670051004125.jpg


思路分析


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

1670051027259.jpg

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

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

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

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


LeetCode 13


题目


1670051043056.jpg


思路分析


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

相关文章
|
2月前
|
Go C++
【力扣】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
【2月更文挑战第18天】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
34 6
|
17天前
|
算法
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
24 1
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
21天前
|
机器学习/深度学习 索引
【力扣】387. 字符串中的第一个唯一字符
【力扣】387. 字符串中的第一个唯一字符
|
21天前
【力扣】9. 回文数
【力扣】9. 回文数
|
2月前
|
存储
leetcode2744. 最大字符串配对数目
leetcode2744. 最大字符串配对数目
17 0
|
2月前
|
机器学习/深度学习 NoSQL Shell
力扣刷题-翻转字符串
力扣刷题-翻转字符串
12 1
|
2月前
|
算法 Java
[Java·算法·简单] LeetCode 28. 找出字符串中第一个匹配项的下标 详细解读
[Java·算法·简单] LeetCode 28. 找出字符串中第一个匹配项的下标 详细解读
23 0
|
2月前
|
算法 Java
[Java·算法·简单] LeetCode 9. 回文数 详细解读
[Java·算法·简单] LeetCode 9. 回文数 详细解读
22 0
|
2月前
|
Go C++
【力扣】2645. 构造有效字符串的最小插入数(动态规划 贪心 滚动数组优化 C++ Go)
【2月更文挑战第17天】2645. 构造有效字符串的最小插入数(动态规划 贪心 滚动数组优化 C++ Go)
31 8

热门文章

最新文章