算法练习之报数, 最大子序和,最后一个单词的长度,加一,二进制求和

 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;
    }
}
原文地址:https://www.cnblogs.com/baby123/p/10880882.html