4.求数组中连续和最大的子数组
首先将nums[0]初始化为初始答案,然后s作为动态最大值,不断更新,ans记录更新过程中的最大值,
由一正数出发,不断加到s,直到遇到一负数,在加上负数前,更新ans,加上负数后,如果大于0,不改变s,如果小于0,更新s为0(也即这一段不要)
class Solution {
public int maxSubArray(int[] nums) {
int s=0;
int ans=0;
for(int i=0;i<nums.length;i++)
{
if(nums[i]<0 && i==0)
{
ans=nums[i];
}
else if(nums[i]<0)
{
s=s+nums[i];
if(s>ans)
{
ans=s;
}
if(s<0)
{
s=0;
}
}
else
{
s=s+nums[i];
if(s>ans)
{
ans=s;
}
}
}
return ans;
}
}
5.数字翻译
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
设立数组d,表示从给的数字的第一个数到第 i 个数有d[i]种翻译方法,则有:
如果nums[i]nums[i-1]有两种表示方法,则d[i]=d[i-1]+d[i-2]
否则只有 d[i]=d[i-1]种
一直更新,到最后输出d[nums.size-1]即可。
class Solution {
int[] d=new int[40];
public boolean check(String a)
{
int n=Integer.valueOf(a);
if(n>=10&&n<=25)
{
return true;
}
return false;
}
public int translateNum(int num) {
String s=String.valueOf(num);
d[0]=1;
d[1]=1;
for(int i=1;i<s.length();i++)
{
if(i==1)
{
if(check(s.substring(0,2)))
{
d[i]=2;
}
else
{
d[i]=1;
}
}
else if(check(s.substring(i-1,i+1)))
{
d[i]=d[i-1]+d[i-2];
}
else
{
d[i]=d[i-1];
}
}
return d[s.length()-1];
}
}
6.深度遍历二叉树,返回其最大深度
import java.math.*;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
public class questionEight {
public static int maxDepth(TreeNode root) {
if(root==null)
{
return 0;
}
else if(root.right==null && root.left==null)
{
return 1;
}
else
{
return Math.max(maxDepth(root.left),maxDepth(root.right))+1;
}
}
public static void main(String[] args) {
}
}