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

 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; 
    } 
}

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/20360.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论