第五天啦
星期五啦,赶了一下课程作业,今天写的题不多,明天加油!
69. x 的平方根
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sqrtx
示例 2:
输入:x = 8输出:2解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
大早上看到这么道题我以为我没睡醒,总之就是一行结束。
class Solution {
public int mySqrt(int x) {
int ans;
return ans=(int)Math.sqrt(x);
}
}
看了一眼大家的题解,谢谢java的MAth类!!嘿嘿我就说嘛,java还是比较智能的啦(变脸怪
70. 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
输入:n = 2输出:2解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
在给出范例的基础上我又多算了几个,发现f(1)=1,f(2)=2,f(3)=3,f(4)=5,f(5)=8,f(6)=13.
可以明显得出一个猜想,f(n)=f(n-1)+f(n-2).唤醒了很久以前的斐波那契数列记忆,很快写出了如下代码:
class Solution {
public int climbStairs(int n) {
return f(n);
}
public int f(int x){
if(x==1) return 1;
if(x==2) return 2;
return f(x-1)+f(x-2);
}
}
我依然记得递归的最大问题是时间太久,但我抱着试一试的心理提交了,果然超出时间限制了。仔细挖掘了一下记忆,当时为了解决这个问题是让给我们将已经算出的结果存入数组,后面直接调用。
于是有了如下时间直接0ms的解答:
class Solution {
public int climbStairs(int n) {
return f(n);
}
public int f(int x){
int[] num=new int[45];
int ans=0;
num[0]=1;
num[1]=2;
for(int i=2;i<x;i++){
num[i]=num[i-1]+num[i-2];
}
return num[x-1];
}
}
其实有点意识到这是个动态规划问题,但还是对这个概念比较模糊。。
3. 无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
根据错误的地方小改了几次,最后的思路为:遍历字符串,设置答案字符串先为s[0],记录子串最大值的变量max为1,后经历遍历在每一次的判断中先用indexOf函数在ans字符串中查看是否有当前成员,若没有则直接加上即可,若有,则取其index,将字符串在index处截断,删掉前面保留后面并加入当前成员进入ans字符串,在每次循环的最后比较当前ans的长度和现max的值,更新max。最后返回max即可。这次的思路其实是参考了之前一次的某个大佬的思路,也算融会贯通学到了点东西
代码如下:
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length()==0) return 0;
String ans=String.valueOf(s.charAt(0));
int max=1;
for(int i=1;i<s.length();i++){
if(ans.indexOf(s.charAt(i))==-1){
ans=ans+String.valueOf(s.charAt(i));
} else{
int n=ans.indexOf(s.charAt(i));
ans=ans.substring(n+1)+s.charAt(i);
}
max=Math.max(ans.length(),max);
}
return max;
}
}