}
之后是正常的青蛙,每次只能跳一个台阶或者两个台阶(斐波那契数列)
1.状态定义 f(n)
2.状态间转移方程定义f(n)=f(n-1)+f(n-2)
3.状态初始化 f(1)=1;
4.返回结果 f(n)
public static int climbingstairs1(int n){
if(n1||n2){
return n;
}
int f1=1;
int f2=2;
int f3=0;
for(int i=3;i<=n;i++){
f3=f1+f2;
f1=f2;
f2=f3;
}
return f3;
}
=========================================================================
分析问题后依旧是斐波那契数列
1.状态定义 f(n)
2.状态间转移方程定义 f(n)=f(n-1)+f(n-2)
3.状态的初始化 f(1)=1 f(2)=2
4.返回结果 f(n)
public static int rectcover(int target) {
if(target1||target2){
return target;
}
int t1=1;
int t2=2;
int t3=0;
for(int i=3;i<=target;i++){
t3=t1+t2;
t1=t2;
t2=t3;
}
return t3;
}
}
或者使用数组记录
public static int rectcover1(int target){
if(target==0){
return 0;
}
int []dp=new int[target+1];
dp[0]=1;
dp[1]=2;
for(int i=2;i<target;i++){
dp[i]=dp[i-1]+dp[i-2];
}
return dp[target-1];
}
=============================================================================
这种题使用动态规划来做的话就和前面几个不相同了,因为其无法定义状态间转移方程
所以就把大问题化成先问题去解决
例如求最大连续字数组和,先求前i个最大字数组的和,最终求最大连续字数组和
时间复杂度o(n),空间复杂度o(1)做法
public int maxsubarray(int[] nums) {
int res=nums[0];
for(int i=1;i<nums.length;i++){
//比较当前值和当前值加上前一个值的大小
nums[i]=math.max(nums[i-1]+nums[i],nums[i]);
res=math.max(nums[i],res);
}
return res;
}
或者另外一种如果前i项最大子序和<=0就重新赋值为下一个数值,记录max最大值
public static int maxsubarray(int[] nums) {
int max=nums[0];
int count=nums[0];
for(int i=1;i<nums.length;i++){
if(count<=0){
count=nums[i];
}else {
count+=nums[i];
}
max=math.max(max,count);
}
return max;
}
==========================================================================
先把大问题化成小问题 前i个字母能否成功分割
状态转移方程是 j<i&&f(j)&&[j,i-1] 即f(j)为true [j,i-1]也为true 这样可以存储true
例如:给定s=“nowcode” 已知 now 和code 在词典中,在找到cow后就可以从j+1位置找到 i位置单词是否能在词典中找到
举例说明:
public boolean wordbreak(string s, set dict) {
if(s.length()==0){
return true;
}
boolean[]array=new boolean[s.length()+1];
for(int i=1;i<=s.length();i++){
//1~i整体范围是一个单词
if(dict.contains(s.substring(0,i))){//substring 是从0到i-1位置
array[i]=true;
continue;
}
for(int j=i-1;j>0;j–){
//部分判断 一部分为前面验证过的true 判断后面的也为true
if(array[j]&&dict.contains(s.substring(j,i))){//substring 是从j位置到i-1位置
array[i]=true;
break;
}
}
}
return array[s.length()];
}
也是这样的字符串拆分 双80%
public boolean wordbreak(string s, list worddict) {
boolean []array=new boolean[s.length()+1];
for(int i=1;i<=s.length();i++){
if(worddict.contains(s.substring(0,i))){
array[i]=true;
continue;
}
for(int j=i-1;j>0;j–){
if(array[j]&&worddict.contains(s.substring(j,i))){
array[i]=true;
break;
}
}
}
return array[s.length()];
}
==============================================================================
给定一个三角矩阵,找出自顶向下的最短路径和,每一步可以移动到下一行相邻的数字
首先确定相邻元素的概念:
1.如果在f(i,j)下一行相邻元素就是 (i+1,j)(i+1,j+1)
如果从下往上推的话,从f(i,j)位置往上的相邻位置就是(i-1,j)(i-1,j-1)
2.状态转移方程是 f(min)=math.min(f(i-1,j),(i-1,j-1))+a(i,j)// 从相邻位置中找到最小值,之后加上当前位置坐标
注意每一行的第一列和最后一列只有一条路径
第一列f(i,0)=f(i-1,0)+a[i][0]
最后一列 f(i,i)=f(i-1,i-1)+a[i][i]
3.初始状态
f(0,0)=a[0][0]
最终思想是从上往下求(先判断边界情况,第一列只有一条路径,最后一列也只有一条路径都加上当前坐标值就好,)之后找最小路径值就可以了。
public int minimumtotal(list<list> triangle) {
list<list> list=new arraylist<>();
for(int i=0;i<triangle.size();i++){
list.add(new arraylist<>());
}
//先定义初始值 在0位置加上(0,0)坐标的值
list.get(0).add(triangle.get(0).get(0));
//之后遍历判断特殊情况 每一行的第一个 ,每一行的最后一个
for(int i=1;i<triangle.size();i++){
int count=0;//当前路径和
for(int j=0;j<=i;j++){
if(j==0){
count=list.get(i-1).get(j);
}else if(i==j){
count=list.get(i-1).get(j-1);
}else {
count=math.min(list.get(i-1).get(j),list.get(i-1).get(j-1));
}
list.get(i).add(triangle.get(i).get(j)+count);
}
}
//之后找到list中到目标路径的最小值即可
int len=triangle.size();
int min=list.get(len-1).get(0);
for(int i=1;i<len;i++){
min=math.min(min,list.get(len-1).get(i));
}
return min;
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、oppo等大厂,18年进入阿里一直到现在。
深知大多数java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注java获取)

总结
对于面试还是要好好准备的,尤其是有些问题还是很容易挖坑的,例如你为什么离开现在的公司(你当然不应该抱怨现在的公司有哪些不好的地方,更多的应该表明自己想要寻找更好的发展机会,自己的一些现实因素,比如对于我而言是现在应聘的公司离自己的家更近,又或者是自己工作到达了迷茫期,想跳出迷茫期等等)
java面试精选题、架构实战文档
整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断!
《一线大厂java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,
/images/e5c14a7895254671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />
总结
对于面试还是要好好准备的,尤其是有些问题还是很容易挖坑的,例如你为什么离开现在的公司(你当然不应该抱怨现在的公司有哪些不好的地方,更多的应该表明自己想要寻找更好的发展机会,自己的一些现实因素,比如对于我而言是现在应聘的公司离自己的家更近,又或者是自己工作到达了迷茫期,想跳出迷茫期等等)
[外链图片转存中…(img-3bn0fqih-1712364577893)]
java面试精选题、架构实战文档
整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断!
《一线大厂java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,
发表评论