最大子序和
问题描述
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
解题思路
要得到前n个元素的连续最大和,必定与前n-1个元素的连续最大和有关,由此可看出此题能用动态规划求解,定义dp[i]为以nums[i]结尾的连续最大和,若已知dp[i-1],则dp[i] = Math.max(dp[i-1]+nums[i],nums[i]) ,最终的结果就是值最大的dp[i]。
class Solution {
public int maxSubArray(int[] nums) {
int n = nums.length;
int dp[] = new int[n];
dp[0] = nums[0];
int res = nums[0];
for(int i=1;i<n;i++){
dp[i] = Math.max(dp[i-1]+nums[i],nums[i]);
res = Math.max(res,dp[i]);
}
return res;
}
}
最后一个单词的长度
问题描述
给你一个字符串 s,由若干单词组成,单词之间用空格隔开。返回字符串中最后一个单词的长度。如果不存在最后一个单词,请返回 0 。
单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
解题思路
这是比较简单的一题,直接从字符串的最后一位往前遍历,遇到字母则长度res+1,若是空格则返回结果res,但是还要注意一种情况:"a ",含有单词,但是字符串以空格结尾。所以再增加一个flag,当flag为0,则表示没有遇到单词,为1则表示遇到了单词,那么只有flag==1且当前字符是空格的时候才返回结果res。
class Solution {
public int lengthOfLastWord(String s) {
int res =0;
int n = s.length();
int flag = 0;//flag为0表示没有单词,为1表示有单词
for(int i=n-1;i>=0;i--){
if(s.charAt(i) != ' '){
res++;
flag = 1;
}
else if(flag == 1 && s.charAt(i) == ' ')
return res;
}
return res;
}
}
加一
问题描述
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
解题思路
这个题需要解决的主要是进位问题,若是个位不进位则直接+1,若是产生进位则前一位+1,若是最高位产生了进位则需要再开辟一个空间,设置最高位为1,为模拟手动运算时的列式计算,可以在while循环中进行。
class Solution {
public int[] plusOne(int[] digits) {
int n = digits.length;
int i = n-1;
while(true){
if(digits[i]+1 == 10){
digits[i] = 0;
i--;
if(i<0){//最高位需要进位
digits = new int[n+1];
digits[0] = 1;
return digits;
}
}else{
digits[i]++;
break;
}
}
return digits;
}
}