LeetCode每日一题12.2

回文数

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

  • 例如,121 是回文,而 123 不是。

示例 1:

输入:x = 121
输出:true

示例 2:

输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:

输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。

提示:

  • -231 <= x <= 231 - 1

暴力破解

方法一
  public boolean isPalindrome(int x) {
//判断是否小于0
        //如果小于0直接判断不是回文数
        if(x<0)return false;
 //获取比较次数
        //首先转化为字符串
        String xstr=x+"";
        //得到字符串的长度,除二向下取整就是比较的次数
        int i=xstr.length()/2;
//开始比较
            //循环遍历
        for(int j=0;j<i;j++){
            //下标从小到大依次获取字符
            char v1=xstr.charAt(j);
            //下标从大到小依次获取字符
            char v2=xstr.charAt(xstr.length()-1-j);
            //比较从两端获取的字符是否相等,不等返回false
            if(v1!=v2)return false;
        }
         //两端向中间遍历,若都相等,会遍历完出循环返回true,说明是回文
             return true;

    }
方法二
 public boolean isPalindrome(int x) {
        //转换为StringBuilder对象,调用reverse()方法将字符串反转,
 String reversedStr= (new StringBuilder(x+"")).reverse().toString();
 //反转后的字符串与原始字符串进行比较
      return (x+"").equals(reversedStr);
    }

罗马数字转整数

罗马数字包含以下七种字符: I, V, X, LCD 和 M

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给定一个罗马数字,将其转换成整数。

示例 1:

输入: s = "III"
输出: 3

示例 2:

输入: s = "IV"
输出: 4

示例 3:

输入: s = "IX"
输出: 9

示例 4:

输入: s = "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.

示例 5:

输入: s = "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.

提示:

  • 1 <= s.length <= 15
  • s 仅含字符 ('I', 'V', 'X', 'L', 'C', 'D', 'M')
  • 题目数据保证 s 是一个有效的罗马数字,且表示整数在范围 [1, 3999] 内
  • 题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况。
  • IL 和 IM 这样的例子并不符合题目要求,49 应该写作 XLIX,999 应该写作 CMXCIX 。
  • 关于罗马数字的详尽书写规则,可以参考 罗马数字 - Mathematics 
public int romanToInt(String s) {
 //定义规则
        HashMap<String, Integer> map = new HashMap<>();
        map.put("I",1);
        map.put("V",5);
        map.put("X",10);
        map.put("L",50);
        map.put("C",100);
        map.put("D",500);
        map.put("M",1000);
        map.put("IV",4);
        map.put("IX",9);
        map.put("XL",40);
        map.put("XC",90);
        map.put("CD",400);
        map.put("CM",900);
//解析规则
        //结果存放result
        int[] result = new int[s.length()];
        int index=0;
        for (int i = 0; i < s.length(); i++) {
            //取单个罗马数字
            String v1=s.charAt(i)+"";

            String v2=null;
            if (i<s.length()-1){
                //取两个罗马数字
                v2=""+s.charAt(i)+s.charAt(i+1);
            }
            //如果规则里面有这两个罗马数字
            if (v2 != null && map.containsKey(v2)) {
                //放入结果中,且i++,执行continue
                result[index++]=map.get(v2);
                i++;
                continue;
            }
            //在没有两个罗马数字的情况下执行单个罗马数字
            if (map.containsKey(v1)){
                result[index++]=map.get(v1);
            }


        }
//计算结果
        int resInt=0;
        for (int i = 0; i < result.length; i++) {
            resInt+=result[i];
        }
            return resInt;
    }

Guess you like

Origin blog.csdn.net/m0_63245620/article/details/134753004