38. 报数
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
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”
public String countAndSay(int n) {
if (n <= 0) {
throw new IllegalArgumentException("n 必须为正整数");
}
String srcStr = "1";
String tempStr = "";
int count = 0;
while (n - 1 > 0) {
for (int i = 0; i < srcStr.length(); i++) {
char i_c = srcStr.charAt(i);
count = 1;
for (int j = i + 1; j < srcStr.length(); j++) {
char j_c = srcStr.charAt(j);
if (i_c == j_c) {
count++;
i = j;
} else {
break;
}
}
tempStr = tempStr + count + i_c;
}
srcStr = tempStr;
tempStr = "";
n--;
}
return srcStr;
}
53. 最大子序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解
public int maxSubArray1(int[] nums) {
if (nums== null) {
throw new IllegalArgumentException("nums is null");
}
if (nums.length == 0) {
throw new IllegalArgumentException("nums's length is 0");
}
// 当前最大和
int result = Integer.MIN_VALUE;
// 相加的总和
int sum = 0;
int max = Integer.MIN_VALUE;
int j = -1;
if (nums.length == 1) {
result = nums[0];
} else {
// 获取第一个大于 0 的数组下标 j 和对应值 sum
for (int i = 0; i < nums.length; i++) {
if (max < nums[i]) {
max = nums[i];
}
if (nums[i] > 0) {
j = i;
sum = nums[i];
break;
}
}
if (j == -1) {
result = max;
} else {
j++;
result = sum;
for (; j < nums.length; j++) {
if (nums[j] < 0) {
if (sum + nums[j] < 0) {
sum = 0;
} else {
sum += nums[j];
}
} else {
if (nums[j] > 0) {
sum += nums[j];
}
}
if (sum >= result) {
result = sum;
}
}
}
}
return result;
}
58. 最后一个单词的长度
给定一个仅包含大小写字母和空格 ’ ’ 的字符串,返回其最后一个单词的长度
如果不存在最后一个单词,请返回 0
说明:一个单词是指由字母组成,但不包含任何空格的字符串
示例:
输入: “Hello World”
输出: 5
public int lengthOfLastWord(String s) {
if (s == null || s.length() == 0) {
return 0;
}
String[] strs = s.split(" ");
if (strs.length == 0) {
return 0;
}
return strs[strs.length - 1].length();
}
61.加一
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一
最高位数字存放在数组的首位, 数组中每个元素只存储一个数字
你可以假设除了整数 0 之外,这个整数不会以零开头
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321
public int[] plusOne(int[] digits) {
if (digits == null || digits.length == 0) {
return null;
}
int i = digits.length - 1;
boolean isAdd = false;
while (i >= 0) {
if (digits[i] == 9 && !isAdd) {
digits[i] = 0;
if (i - 1 >= 0) {
digits[i - 1] += 1;
isAdd = true;
if (digits[i - 1] == 9) {
break;
}
} else {
int[] destArr = new int[digits.length + 1];
System.arraycopy(digits, 0, destArr, 0, digits.length);
destArr[0] = 1;
return destArr;
}
} else if (digits[i] == 10) {
digits[i] = 0;
if (i - 1 >= 0) {
digits[i - 1] += 1;
isAdd = true;
} else {
int[] destArr = new int[digits.length + 1];
System.arraycopy(digits, 0, destArr, 0, digits.length);
destArr[0] = 1;
return destArr;
}
} else if (i == digits.length - 1) {
digits[i] += 1;
break;
}
if (i == 0) {
break;
}
i--;
}
return digits;
}
67.二进制求和
给定两个二进制字符串,返回他们的和(用二进制表示)
输入为非空字符串且只包含数字 1 和 0
示例 1:
输入: a = “11”, b = “1”
输出: “100”
示例 2:
输入: a = “1010”, b = “1011”
输出: “10101”
public String addBinary(String a, String b) {
if (a ==null || b == null) {
return "";
}
if (a.length() == 0) {
if (b.length() == 0) {
return "";
}
return b;
} else if (b.length() == 0) {
if (a.length() == 0) {
return "";
}
return a;
}
char[] acs = a.toCharArray();
char[] bcs = b.toCharArray();
int acs_len = acs.length;
int bcs_len = bcs.length;
StringBuilder sb = new StringBuilder();
int more_len = Math.max(acs_len, bcs_len);
char add = '0';
for (int i = 0; i < more_len; i++) {
char ac = i < acs_len ? acs[acs_len - 1 - i] : '0';
char bc = i < bcs_len ? bcs[bcs_len - 1 - i] : '0';
char cadd = ac == bc ? '0' : '1';
char cs = cadd == add ? '0' : '1';
if (ac == '1' && bc == '1' || cadd == '1' && add == '1') {
add = '1';
} else {
add = '0';
}
sb.append(cs);
}
if (add == '1') {
sb.append(add);
}
return sb.reverse().toString();
}