剑指offer5:替换空格
请实现一个函数,把字符串 s
中的每个空格替换成"%20"。
解题思路:
设置一个sb,把字符串s转化为字符ch,循环遍历字符串s,当遇见空格以后就利用append方法将%20拼接到字符串后面,否则直接把字符拼接到后面即可。
class Solution {
public String replaceSpace(String s) {
StringBuilder sb = new StringBuilder();
int len = s.length();
for(int i = 0;i < len;i++){
char ch = s.charAt(i);
if(ch == ' ')
sb.append("%20");
else
sb.append(ch);
}
return sb.toString();
}
}
剑指offer58-II 左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
解题思路:本题实际上就是将前n个字符剪切到剩下的字符后面,本质上还是字符串的拼接。
class Solution {
public String reverseLeftWords(String s, int n) {
StringBuilder res = new StringBuilder();
for(int i = n;i < s.length();i++){
res.append(s.charAt(i));
}
for(int i = 0;i < n;i++){
res.append(s.charAt(i));
}
return res.toString();
}
}
Leetcode53:最大子数组和
给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。
题目解析:动态规划
这个题,乍一看简单,实际上想了好半天毫无思绪,看了大佬的题解。
示例 1 输入数组是 [-2,1,-3,4,-1,2,1,-5,4],可以划分为子问题:
子问题 1:以 −2 结尾的连续子数组的最大和是多少;
子问题 2:以 1 结尾的连续子数组的最大和是多少;
子问题 3:以 −3 结尾的连续子数组的最大和是多少;
子问题 4:以 4 结尾的连续子数组的最大和是多少;
子问题 5:以 −1 结尾的连续子数组的最大和是多少;
子问题 6:以 2 结尾的连续子数组的最大和是多少;
子问题 7:以 1 结尾的连续子数组的最大和是多少;
子问题 8:以 −5 结尾的连续子数组的最大和是多少;
子问题 9:以 4 结尾的连续子数组的最大和是多少。
可以看出子问题1的结果是-2,子问题2的结果是1,子问题3的结果是1,子问题4的结果是4,子问题5的结果是4,子问题6的结果是5,子问题7的结果是6……由此可见,如果第i个子问题是负数或者0,就舍弃这个问题的结果,如果大于0,就选最大值。
class Solution {
public int maxSubArray(int[] nums) {
int len = nums.length;
int[] dp = new int[len];
dp[0] = nums[0];
for(int i = 1;i < len;i++){
if(dp[i-1] > 0){
dp[i] = dp[i - 1] + nums[i];
}else{
dp[i] = nums[i];
}
}
int res = dp[0];
for(int i = 1;i < len;i++){
res = Math.max(res,dp[i]);
}
return res;
}
}