栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

力扣学习每日打卡

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

力扣学习每日打卡

0804 移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

首先简单写一下我的思路,这道题目需要的是删除不存在的元素,其实也就是在原来的基础上将不需要的数据移动到数组的后面然后返回你需要的长度就行!

那么就可以使用双指针方式进行,走到对应的数据的位置的时候可以进行数据的交换,然后当两个指针碰撞的时候就可以结束了!

class Solution {
    public int removeElement(int[] nums, int val) {
        int length=nums.length;
        if(length==0){
            return 0;
        }
        int index=length-1;
        //采用双指针的方式
        for(int i=0;i 
0805 
POW函数 

实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。

方法一:暴力求解

首先面对这个问题,我自己最开始的想法当然还是使用暴力破解,因为这里暴力破解很方便嘛,但是就会遇到一个问题,那就是我的提交超出了时间限制,也就是说明我的时间复杂度太大的。

下面是我使用暴力求解的代码:

class Solution {
    public double myPow(double x, int n) {
        if(n==0) return 1;
        //这里最简单的当然是使用for循环
        double num=1.0;
        if(n>0){
            for(int i=1;i<=n;i++){
                num*=x;
            }
        }
        if(n<0){
            for(int i=1;i<=-n;i++){
                num/=x;
            }
        }
        return num;
    }
}
方法二:快速幂+递归

然后我们还有第二种方法,那就是使用快速幂+递归的方式

我们首先举几个例子做一下说明:

我们算x^64的时候,我们是不是可以这样算:

x^2 -> x^4 ->x^8 -> x^16 -> x^32 -> x^64 

也就是在原来的基础上每次乘以2

class Solution{
    public double myPow(double x, int n) {
        long N = n;
        return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);
    }

    public double quickMul(double x, long N) {
        if (N == 0) {   //最后都会到达这里,然后相当于从下往上进行计算
            return 1.0;
        }
        double y = quickMul(x, N / 2);
        return N % 2 == 0 ? y * y : y * y * x;
    }
}

这题有一点没有说清楚那就是边界,没有指明我的n的取值的范围,假设我的N取值为无限大,那么就会造成溢出,所以面试的时候如果遇到这个题目就需要问清楚啦!

0806 旋转图像

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

方法一:原地旋转 

那么首先我们拿到这个题目相比大家都知道了,我们要做的就是找规律!!

这个时候如果我们直接将元素进行移动,那么就一定会出现一个问题,那就是我们原来在(col,n-row-1)位置上的元素会被覆盖,这个时候我们就需要使用一个临时变量temp去存储这个位置上的元素。

那么在(col,n-row-1)上的元素又会移动到哪里?

根据上面规律我们可以代入得,会移动到(n-row-1,n-col-1)

然后我们再来一次,会发现在(n-row-1,n-col-1)位置上的元素会移动到(n-col-1,row)

最后我们再来最后一次,会发现(n-col-1,row)得元素就会变到(row,col)的位置上,发现了什么?我们又转回来了!!!

所以,最后我们可以得到一个方程式,就是

 

class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        for (int i = 0; i < n / 2; ++i) {
            for (int j = 0; j < (n + 1) / 2; ++j) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[n - j - 1][i];
                matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
                matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
                matrix[j][n - i - 1] = temp;
            }
        }
    }
}

 方法二:两次翻转

首先我们来一个概念的理解,那就是关于图片的翻转的

好了,有了上面的规律,我们就可以用这种翻转来解决我们的问题了!

对于旋转九十度,得到的为 (row=col  ,  col=n-row-1)  

用我们图片翻转的规律就是 : 水平翻转+反对角线翻转

class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        // 水平翻转
        for (int i = 0; i < n / 2; ++i) {
            for (int j = 0; j < n; ++j) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[n - i - 1][j];
                matrix[n - i - 1][j] = temp;
            }
        }
        // 主对角线翻转
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < i; ++j) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
    }
}

 好了,然后我们再来几个翻转的案例,如果我们旋转180°,相当于怎么翻转??

1. 旋转180°之后我们的结果就是(row=n-row-1  col=n-col-1)

那么是怎么翻转过来的?

那就相当于先水平翻转再垂直翻转!

2. 旋转270°之后的结果就是 (row=n-col-1 col=row)

旋转就相当于先垂直翻转再主对角翻转!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1036644.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号