6

每日算法&面试题,大厂特训十四天——第二天(双指针)

 2 years ago
source link: https://blog.csdn.net/jiahuiandxuehui/article/details/121464201
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在这里插入图片描述

肥友们为了更好的去帮助新同学适应算法和面试题,最近我们开始进行专项突击一步一步来。上一期我们完成了动态规划二十一天现在我们进行下一项对各类算法进行十四天的一个小总结。还在等什么快来一起肥学进行十四天挑战吧!!

特别介绍

📣小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶

📣python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章,可以让你快乐学python练手项目专栏

📣另外想学JavaWeb进厂的同学可以看看这个专栏:传送们

📣这是个冲刺大厂面试专栏还有算法比赛练习我们一起加油 上岸之路

算法特训十四天

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
示例 2:

输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]

我们可以使用两个指针分别指向位置 00 和
n-1n−1,每次比较两个指针对应的数,选择较大的那个逆序放入答案并移动指针。这种方法无需处理某一指针移动至边界的情况

class Solution {
    public int[] sortedSquares(int[] nums) {
        int n = nums.length;
        int[] ans = new int[n];
        for (int i = 0, j = n - 1, pos = n - 1; i <= j;) {
            if (nums[i] * nums[i] > nums[j] * nums[j]) {
                ans[pos] = nums[i] * nums[i];
                ++i;
            } else {
                ans[pos] = nums[j] * nums[j];
                --j;
            }
            --pos;
        }
        return ans;
    }
}

给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例 1:

输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]
示例 2:

输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释: 
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]

当我们将数组的元素向右移动 kk 次后,尾部 k\bmod nkmodn 个元素会移动至数组头部,其余元素向后移动 k\bmod
nkmodn 个位置。

该方法为数组的翻转:我们可以先将所有元素翻转,这样尾部的 k\bmod nkmodn 个元素就被移至数组头部,然后我们再翻转 [0,
k\bmod n-1][0,kmodn−1] 区间的元素和 [k\bmod n, n-1][kmodn,n−1]
区间的元素即能得到最后的答案。

class Solution {
    public void rotate(int[] nums, int k) {
        k %= nums.length;
        reverse(nums, 0, nums.length - 1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, nums.length - 1);
    }

    public void reverse(int[] nums, int start, int end) {
        while (start < end) {
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            start += 1;
            end -= 1;
        }
    }
}


继续写有关二叉树的问题:

package tree;

public class node {
	public int val;
	public node left;//左孩子
	public node right;//右孩子
	public node() {
		
	}
	public node(int val,node left,node right) {
		this.val=val;
		this.left=left;
		this.right=right;
	}
	public node(int val, node left) {
		super();
		this.val = val;
		this.left = left;
	}
	
}

package tree;

public class MirrorTree {
	//判断两颗树是否为镜像
	public boolean isMirrorTree(node root1,node root2) {
		if(root1==null&&root2==null) {
			return true;
		}else if(root1==null||root2==null) {
			return false;
		}else if(root1.val!=root2.val) {
			return false;
		}
		return isMirrorTree(root1.left,root2.right)&&isMirrorTree(root1.right,root2.left);
	}
	//制作反转二叉树(镜像二叉树)
	public node mirrorTree(node root) {
		if(root==null) {
			return null;
		}
		node left=mirrorTree(root.left);
		node right=mirrorTree(root.right);
		root.left=right;
		root.right=left;
		return root;
	}
}

点击直接资料领取

这里有python,Java学习资料还有有有趣好玩的编程项目,更有难寻的各种资源。反正看看也不亏。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK