第一题:连续子数组的最大和
原题连接:剑指Offer 42
题目描述:
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
解题思路:动态规划
public static int maxSubArray(int[] nums) {
if (nums == null || nums.length == 0)
return 0;
int len = nums.length;
int[] dp = new int[len];
dp[0] = nums[0];
int maxlen = 0;
for (int i = 1; i < len; i++) {
dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);
if (dp[i] > maxlen)
maxlen = dp[i];
}
return maxlen;
}
第二题:缺失的数字
原题连接:剑指Offer 53
题目描述:
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
题解:二分查找
class Solution {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
String[] str=s.split(" ");
int[] res=new int[str.length];
for(int i=0;i<str.length;i++)
res[i]=Integer.parseInt(str[i]);
System.out.println(missingNumber(res));
}
public static int missingNumber(int[] nums) {
int left=0,right=nums.length-1;
while (left<=right){
int mid=(left+right)/2;
if(nums[mid]==mid) left=mid+1;
else
right=mid-1;
}
return left;
}
}
第三题:大数相加
原题连接:415
题目描述:
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
题解:迭代法
public static String addStrings (String num1, String num2) {
StringBuilder sb=new StringBuilder();
int i=num1.length()-1,j=num2.length()-1,carry=0;
while (i>=0||j>=0){
int m=i>=0?num1.charAt(i)-'0':0;
int n=j>=0?num2.charAt(j)-'0':0;
int tmp=m+n+carry;
carry=tmp/10;
sb.append(tmp%10);
i--;
j--;
}
if(carry==1)
sb.append(1);
return sb.reverse().toString();
}