zoukankan      html  css  js  c++  java
  • 算法练习之两数相加(链表保存的整数),罗马数字转整数,有效的括号,最长公共前缀

    最近在学习java,但是对于数据操作那部分还是不熟悉

    因此决定找几个简单的算法写,用php和java分别实现

    1.两数相加

    两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

    如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

    您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

    示例:

    输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出:7 -> 0 -> 8
    原因:342 + 465 = 807

    java

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            ListNode pHead = new ListNode(0),p = pHead;
            int carry = 0;
            while(l1!=null||l2!=null||carry !=0){
                ListNode tmp= new ListNode(0);
                tmp.val += carry;
                if(l1!=null){
                    tmp.val+=l1.val;
                    l1=l1.next;
                }
                if(l2!=null){
                    tmp.val+=l2.val;
                    l2=l2.next;
                }
                carry = (int)(tmp.val/10);
                tmp.val = tmp.val%10;
                p.next = tmp;
                p = tmp;
            }
            if(pHead.next==null)return pHead;
            return pHead.next;
        }
    }

    php

    /**
     * Definition for a singly-linked list.
     * class ListNode {
     *     public $val = 0;
     *     public $next = null;
     *     function __construct($val) { $this->val = $val; }
     * }
     */
    class Solution {
        /**
         * @param ListNode $l1
         * @param ListNode $l2
         * @return ListNode
         */
        function addTwoNumbers($l1, $l2) {
            $pHead = new ListNode(0);
            $p = $pHead;
            $carry = 0;
            while($l1!=null||$l2!=null||$carry !=0){
                $tmp= new ListNode(0);
                $tmp->val += $carry;
                if($l1!=null){
                    $tmp->val+=$l1->val;
                    $l1=$l1->next;
                }
                if($l2!=null){
                    $tmp->val+=$l2->val;
                    $l2=$l2->next;
                }
                $carry = floor($tmp->val/10);
                $tmp->val = $tmp->val%10;
                $p->next = $tmp;
                $p = $tmp;
            }
            if($pHead->next==null)return $pHead;
            return $pHead->next;
        }
    }

    2.罗马数字转整数

    罗马数字包含以下七种字符: 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 到 3999 的范围内。

    示例 1:

    输入: "III"
    输出: 3

    示例 2:

    输入: "IV"
    输出: 4

    示例 3:

    输入: "IX"
    输出: 9

    示例 4:

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

    示例 5:

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

    java

    class Solution {
        public int romanToInt(String s) {
            int rs = 0;
            char c,pc;
            int tmp=0,tmp1=0;
            for (int i=0;i<s.length();i++){
                c = s.charAt(i);
                tmp = getNumber(c);
                if(i==0){
                    rs = rs+tmp;
                }else{
                    pc = s.charAt(i-1);
                    tmp1 = getNumber(pc);
                    if(tmp<=tmp1){
                        rs = rs+tmp;
                    }else{
                        rs = rs+(tmp-tmp1-tmp1);
                    }
                }
            }
            return rs;
        }
        
        public int  getNumber(char num){
            switch(num){
                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;
            }
            return 0;
        }
    }

    php

    class Solution {
    
        /**
         * @param String $s
         * @return Integer
         */
        function romanToInt($s) {
            $rs = 0;
            for ($i=0;$i<strlen($s);$i++){
                
                $c = substr($s,$i,1);
                $tmp = $this->getNumber($c);
                if($i==0){
                    $rs = $rs+$tmp;
                }else{
                    $pc = substr($s,$i-1,1);
                    $tmp1 = $this->getNumber($pc);
                    if($tmp<=$tmp1){
                        $rs = $rs+$tmp;
                    }else{
                        $rs = $rs+($tmp-$tmp1-$tmp1);
                    }
                }
            }
            return $rs;
        }
        function getNumber($num){
            switch($num){
                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;
            }
            return 0;
        }
    }

    3.有效的括号

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

    有效字符串需满足:

    1. 左括号必须用相同类型的右括号闭合。
    2. 左括号必须以正确的顺序闭合。

    注意空字符串可被认为是有效字符串。

    示例 1:

    输入: "()"
    输出: true
    

    示例 2:

    输入: "()[]{}"
    输出: true
    

    示例 3:

    输入: "(]"
    输出: false
    

    示例 4:

    输入: "([)]"
    输出: false
    

    示例 5:

    输入: "{[]}"
    输出: true

    java

    class Solution {
        public boolean isValid(String s) {
            char[] charArray = s.toCharArray();
            Stack<Character> stack = new Stack<>();
            for (Character c : charArray) {
                switch (c) {
                    case '(':
                    case '[':
                    case '{':
                        stack.push(c);
                        break;
                    case ')':
                        if (stack.isEmpty() || '(' != stack.pop()) {return false;
                        }
                        break;
                    case ']':
                        if (stack.isEmpty() || '[' != stack.pop()) {return false;
                        }
                        break;
                    case '}':
                        if (stack.isEmpty() || '{' != stack.pop()) {return false;
                        }
                        break;
                }
            }
            return stack.isEmpty();
        }
    }

    php

    class Solution {
    
        /**
         * @param String $s
         * @return Boolean
         */
        function isValid($s) {
            $len = strlen($s);
            $hao = ['(',')','{','}','[',']'];
            $result = [];
            $item = '';
            for($i=0;$i<$len;$i++){
                $t= substr($s,$i,1);
                if(in_array($t,$hao)){
                    switch($t){
                        case '(':
                        case '[':
                        case '{':   
                            array_push($result,$t);
                            break;
                        case ')';
                            if(count($result)==0||array_pop($result) != '(' ){
                                return false;
                            }
                            break;
                        case ']';
                            if(count($result)==0||array_pop($result) != '[' ){
                                return false;
                            }
                            break;
                        case '}';
                            if(count($result)==0||array_pop($result) != '{' ){
                                return false;
                            }
                            break;
                    }
                }
            }
            return count($result) == 0;
        }
    }

     4.最长公共前缀

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

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

    示例 1:

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

    示例 2:

    输入: ["dog","racecar","car"]
    输出: ""
    解释: 输入不存在公共前缀。
    

    说明:

    所有输入只包含小写字母 a-z 。

    java

    class Solution {
        public String longestCommonPrefix(String[] strs) {
            if(strs.length==1){
                return strs[0];
            }
            StringBuilder sb = new StringBuilder();
            if(strs.length>1){
                for(int i=0;i<strs[0].length();i++){
                    char c = strs[0].charAt(i);
                    for(int j=1;j<strs.length;j++){
                        if(i>=strs[j].length()||strs[j].charAt(i)!=c){
                            return sb.toString();
                        }
                        if(j==strs.length-1||strs[j].charAt(i)!=c){
                            sb.append(c);
                        }
                    }
                }
            }
            return sb.toString();
        }
    }

    测试

    public class Main {
        public static void main(String[] args) {
            Solution ss = new Solution();
            String[] xx = new String[]{"flower","flow","flight"};
            String yy = ss.longestCommonPrefix(xx);
            System.out.println("longestCommonPrefix----"+yy);
        }
    }

    php

    class Solution {
    
        /**
         * @param String[] $strs
         * @return String
         */
        function longestCommonPrefix($strs) {
            $rs = [];
            if(count($strs)==1){
                return $strs[0];
            }
            for($i=0;$i<strlen($strs[0]);$i++){
                $c = substr($strs[0],$i,1);
                for($j=1;$j<count($strs);$j++){
                    if($i>=strlen($strs[$j])||$strs[$j][$i]!=$c){
                        return implode("",$rs);
                        break;
                    }
                    if($j==count($strs)-1||$strs[$j][$i]!=$c){
                        array_push($rs,$c);
                    }
                }
            }
            return implode("",$rs);
        }
    }
  • 相关阅读:
    linux下activemq安装与配置
    Linux设置开放一个端口
    使用codis-admin搭建codis集群
    elasticsearch7.0安装及配置优化
    ELK详细安装部署
    filebeat安装部署
    ElasticSearch-5.3.1集群环境搭建,安装ElasticSearch-head插件,安装错误解决
    手把手教你搭建一个 Elasticsearch 集群
    ES 集群管理(集群规划、集群搭建、集群管理)
    Elasticsearch如何关掉服务
  • 原文地址:https://www.cnblogs.com/baby123/p/10861656.html
Copyright © 2011-2022 走看看