zoukankan      html  css  js  c++  java
  • 算法练习之报数, 最大子序和,最后一个单词的长度,加一,二进制求和

     1.报数

    报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:

    1.     1
    2.     11
    3.     21
    4.     1211
    5.     111221
    

    1 被读作  "one 1"  ("一个一") , 即 11
    11 被读作 "two 1s" ("两个一"), 即 21
    21 被读作 "one 2",  "one 1" ("一个二" ,  "一个一") , 即 1211

    给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。

    注意:整数顺序将表示为一个字符串。

    示例 1:
    输入: 1
    输出: "1"
    
    示例 2:
    输入: 4
    输出: "1211"

    java

    class Solution {
        public String countAndSay(int n) {
    
            if(n==0) return "";
            if(n==1) return "1";
            String s = "1";
            for(int i=2;i<=n;i++){
                s=backStr(s);
            }
            return s;
        }
        public String backStr(String s){
    
            StringBuilder sb = new StringBuilder();
            char c = s.charAt(0);
            int count=1;
            int i=1;
            for(;i<s.length();i++){
                if(c==s.charAt(i)){
                    count++;
                }else{
                    sb.append(count).append(c);
                    c = s.charAt(i);
                    count=1;
                }
            }
            if(count>0){
                sb.append(count).append(c);
            }
            return sb.toString();
        }
    }

    php

    class Solution {
    
        /**
         * @param Integer $n
         * @return String
         */
        public function countAndSay($n)
        {
            if ($n == 0)  return "";
            if ($n == 1)  return "1";
            $s = "1";
            for ($i = 2; $i <= $n; $i++) {
                $s = $this->backStr($s);
            }
            return $s;
        }
        public function backStr($s)
        {
            $rs = "";
            $k  = 1;
            $c = $s[0];
            for ($i = 1; $i < strlen($s); $i++) {
                if ($s[$i] == $c) {
                    $k++;
                } else {
                    $rs .= $k . $c;
                    $c = $s[$i];
                    $k = 1;
                }
            }
            if($k>0){
                $rs .= $k . $c;
            }
            return $rs;
        }
    }

    2.最大子序和

    给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

    示例:

    输入: [-2,1,-3,4,-1,2,1,-5,4],
    输出: 6
    解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

    java

    class Solution {
        public int maxSubArray(int[] nums) {
            
            int sum = 0;
            int rs = nums[0];
            for(int n:nums){
                if(sum>0){
                    sum+=n;
                }else{
                    sum = n;
                }
                rs = Math.max(rs,sum);
            }
            return rs;
        }
    }

    php

    class Solution {
    
        /**
         * @param Integer[] $nums
         * @return Integer
         */
        function maxSubArray($nums) {
            
            $sum = 0;
            $rs = $nums[0];
            foreach ($nums as $key => $value) {
                if($sum>0){
                    $sum+=$value;
                }else{
                    $sum = $value;
                }
                $rs = max($rs,$sum);
            }
            return $rs;
        }
    }

     3.最后一个单词的长度

    给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度。

    如果不存在最后一个单词,请返回 0 。

    说明:一个单词是指由字母组成,但不包含任何空格的字符串。

    示例:

    输入: "Hello World"
    输出: 5

    java

    class Solution {
        public int lengthOfLastWord(String s) {
    
            int len = 0;
            boolean isLetter = false;
            char[] arr = s.toCharArray();
            for(int i =arr.length-1;i>=0;i--){
                if(arr[i]==' '){
                    if(!isLetter){
                        continue;
                    }
                    break;
                }else{
                    isLetter = true;
                    len++;
                }
            }
            return len;
        }
    }

    php

    class Solution {
    
        /**
         * @param String $s
         * @return Integer
         */
        function lengthOfLastWord($s) {
            
            $len = 0;
            $s = rtrim($s);
            if(!empty($s)){
                for($i=strlen($s)-1;$i>=0;$i--){
                    if($s[$i]!=' '){
                        $len++;
                    }else{
                        break;
                    }
                }
            }
            return $len;
        }
    }

     4.加一

    给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。

    最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。

    可以假设除了整数 0 之外,这个整数不会以零开头。

    示例 1:
    输入: [1,2,3]
    输出: [1,2,4]
    解释: 输入数组表示数字 123。
    
    示例 2:
    输入: [4,3,2,1]
    输出: [4,3,2,2]
    解释: 输入数组表示数字 4321。

    java

    class Solution {
        public int[] plusOne(int[] digits) {
            int c=0;
            boolean f= false;
            for(int i=digits.length-1;i>=0;i--){
                if(digits[i]+1>9){
                    f = true;
                    digits[i] = 0;
                }else{
                    digits[i] +=1;
                    f=false;
                    break;
                }
            }
            if(f) {
                digits = new int [digits.length + 1];
                digits[0] = 1;
            }
            return digits;
        }
    }

    php

    class Solution {
    
        /**
         * @param Integer[] $digits
         * @return Integer[]
         */
        function plusOne($digits) {
            $f = false;
            for ($i = count($digits) - 1; $i >= 0; $i--) {
                if ($digits[$i] + 1 > 9) {
                    $f          = true;
                    $digits[$i] = 0;
                } else {
                    $f = false;
                    $digits[$i] += 1;
                    break;
                }
            }
            if ($f) {
                array_unshift($digits, 1);
            }
            return $digits;
        }
    }

    5.二进制求和

    给定两个二进制字符串,返回他们的和(用二进制表示)。

    输入为非空字符串且只包含数字 1 和 0

    示例 1:
    输入: a = "11", b = "1"
    输出: "100"
    
    示例 2:
    输入: a = "1010", b = "1011"
    输出: "10101"

    java

    class Solution {
        public String addBinary(String a, String b) {
            String str = "";
            int r = 0, sum = 0;
            int p = a.length() - 1;
            int q = b.length() - 1;
            while (p>=0 ||q>=0) {
                int a1 = p >= 0 ? a.charAt(p--)-'0' : 0;
                int b1 = q >= 0 ? b.charAt(q--)-'0' : 0;
                sum = a1 + b1 + r;
                str = String.valueOf(sum % 2) + str;
                r = sum / 2;
            }
            if(r==1) str = "1"+str;
            return str;
        }
    }

    php

    class Solution {
    
        /**
         * @param String $a
         * @param String $b
         * @return String
         */
        function addBinary($a, $b) {
            $p = strlen($a)-1;
            $q = strlen($b)-1;
            $r = 0;$sum = 0;
            $str = '';
            while($p>=0||$q>=0){
                $a1 = $p>=0?$a[$p--]:0;
                $b1 = $q>=0?$b[$q--]:0;
                $sum = $a1+$b1+$r;
                $str = ($sum%2).$str;
                $r = floor($sum/2);
            }
            if($r==1) $str = "1".$str;
            return $str;
        }
    }
  • 相关阅读:
    OpenCL、CUDA
    最小和最廉价的超级计算机,DIY的
    组装属于您自己的Tesla个人超级计算机
    多处理器系统
    开源项目Spark简介
    基于Cassandra的日志和分布式小文件存储系统【1】
    网络广告js备忘【2】
    网络广告js备忘【1】
    成功产品的意外
    Cassandra HBase和MongoDb性能比较
  • 原文地址:https://www.cnblogs.com/baby123/p/10880882.html
Copyright © 2011-2022 走看看