• 算法题 week2


    13# 罗马数字转整数

    罗马数字包含以下七种字符: I, V, X, L,C,D 和 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 到 3999 的范围内。

    思路:分别找到个位,十位,百位和千位。I II III IV V VI VII VIII IX 1-9  X XX XXX XL L LX LXX LXXX XC  10-90  C CC CCC CD D DC DCC DCCC CM 100-900 M MM MMM 1000-3000 

    逐个识别,如果比已有值大,就加上,如果小,就减去。

    class Solution {
        public static int getValue(char c){
            switch (c){
                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 : throw new IllegalArgumentException("Illegal character");
            }
        }
        public int romanToInt(String s) {
            int result = 0;
            int i=0;
            int n = s.length();
            while(i<n){
                if(i==n-1||getValue(s.charAt(i))>=getValue(s.charAt(i+1))){
                    result = result + getValue(s.charAt(i));
                }
                else
                    result = result - getValue(s.charAt(i));
                i++;
            }
            return result;
        }
    }

    14#   最长公共前缀

    编写一个函数来查找字符串数组中的最长公共前缀。

    如果不存在公共前缀,返回空字符串 ""。

    示例 1:输入: ["flower","flow","flight"]输出: "fl"

    示例 2:输入: ["dog","racecar","car"]输出: ""

    解释: 输入不存在公共前缀。
    说明:所有输入只包含小写字母 a-z 。

    思路:先取前两个字符串比较,得到的结果再和第三个比较,以此类推。

    class Solution {
      public String longestCommonPrefix(String[] strs) {
       if (strs.length == 0) return "";
       String prefix = strs[0];
       for (int i = 1; i < strs.length; i++)
           while (strs[i].indexOf(prefix) != 0) {
               prefix = prefix.substring(0, prefix.length() - 1);
               if (prefix.isEmpty()) return "";
           }        
       return prefix;
    }
    }
    indexOf用于查找字符串,返回括号内字符串出现的初始位置,从0开始。
    substring用于截取字符串,括号中(a,b)a表示初始点,b-1表示截至点。

    20# 有效的括号

    给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

    有效字符串需满足:

    左括号必须用相同类型的右括号闭合。
    左括号必须以正确的顺序闭合。
    注意空字符串可被认为是有效字符串。

    class Solution {
        private HashMap<Character,Character>  mappings;
        public Solution(){
            this.mappings = new HashMap<Character,Character>();
            this.mappings.put(')','(');
            this.mappings.put(']','[');
            this.mappings.put('}','{');
        }
        public boolean isValid(String s) {
          Stack<Character> stack = new Stack<Character>(); //new一个栈
            
            for(int i=0;i<s.length();i++){
                char c = s.charAt(i);
                if(this.mappings.containsKey(c)){
                    char topElement = stack.empty()?'#':stack.pop();
                    if(topElement!=this.mappings.get(c))
                        return false;
                }
                else{
                    stack.push(c);
                }
            }
            return stack.isEmpty();
        }
    }

    想到用栈的思想来处理,但是没想到用hashmap的方法,上面贴出的是标准题解,看了很久才看懂,对我来说不简单啊……

  • 相关阅读:
    Java消息队列--JMS概述
    Java消息队列--ActiveMq 初体验
    tomcat 日志禁用
    解决Tomcat catalina.out 不断成长导致档案过大的问题
    CentOS防火墙iptables-config的相关配置参数详解
    关于centos7下/etc/sysconfig/目录没有iptables问题
    死磕nginx系列--nginx 限流配置
    Nginx配置之负载均衡、限流、缓存、黑名单和灰度发布
    Android第一个个人APP(帐号助手)
    HDU 2896 病毒侵袭 (AC自己主动机)
  • 原文地址:https://www.cnblogs.com/XinL-blog/p/11530745.html
Copyright © 2020-2023  润新知