第五天啦

星期五啦,赶了一下课程作业,今天写的题不多,明天加油!

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);

    }

}

看了一眼大家的题解,谢谢javaMAth类!!嘿嘿我就说嘛,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],记录子串最大值的变量max1,后经历遍历在每一次的判断中先用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;

    }

}

posted @ 2022-03-19 00:10  水煮小白菜  阅读(30)  评论(0编辑  收藏  举报