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