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

相关文章
|
3月前
|
算法
LeetCode回文数(暴力解,求更好的思路)
这篇博客讨论了如何判断一个整数是否为回文数,提供了暴力解法的代码,并寻求更优的算法建议。
58 1
LeetCode回文数(暴力解,求更好的思路)
|
3月前
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
41 1
|
3月前
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
32 9
|
3月前
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
25 0
|
3月前
【LeetCode 22】459.重复的子字符串
【LeetCode 22】459.重复的子字符串
34 0
|
3月前
【LeetCode 20】151.反转字符串里的单词
【LeetCode 20】151.反转字符串里的单词
27 0
|
3月前
【LeetCode 19】541.反转字符串II
【LeetCode 19】541.反转字符串II
26 0
|
3月前
【LeetCode 18】6.2.反转字符串
【LeetCode 18】6.2.反转字符串
24 0
|
5月前
|
存储 算法
LeetCode第43题字符串相乘
LeetCode第43题"字符串相乘"的解题方法,通过使用数组存储乘积并处理进位,避免了字符串转换数字的复杂性,提高了算法效率。
LeetCode第43题字符串相乘
|
5月前
|
算法 Java
LeetCode第28题找出字符串中第一个匹配项的下标
这篇文章介绍了LeetCode第28题"找出字符串中第一个匹配项的下标"的两种解法:暴力解法和KMP算法,并解释了KMP算法通过构建前缀表来提高字符串搜索的效率。
LeetCode第28题找出字符串中第一个匹配项的下标