HIGH高频H3(21-31),请谈下Android消息机制

本文深入探讨了多种数据结构和算法的应用,包括链表的快速排序、全排列生成、二叉树的中序遍历以及斐波那契数列的动态规划解法。通过实例解析,展示了如何使用递归和栈解决复杂问题,以及如何优化链表操作以提高效率。此外,还涵盖了数组的滑动窗口最大值问题,揭示了在算法设计中寻找高效解决方案的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

if(headnull||head.nextnull) return head;

// 没有条件,创造条件。自己添加头节点,最后返回时去掉即可。

ListNode newHead=new ListNode(-1);

newHead.next=head;

retu

rn quickSort(newHead,null);

}

// 带头结点的链表快速排序

private ListNode quickSort(ListNode head,ListNode end){

if (headend||head.nextend||head.next.next==end) return head;

// 将小于划分点的值存储在临时链表中

ListNode tmpHead=new ListNode(-1);

// partition为划分点,p为链表指针,tp为临时链表指针

ListNode partition=head.next,p=partition,tp=tmpHead;

// 将小于划分点的结点放到临时链表中

while (p.next!=end){

if (p.next.val<partition.val){

tp.next=p.next;

tp=tp.next;

p.next=p.next.next;

}else {

p=p.next;

}

}

// 合并临时链表和原链表,将原链表接到临时链表后面即可

tp.next=head.next;

// 将临时链表插回原链表,注意是插回!(不做这一步在对右半部分处理时就断链了)

head.next=tmpHead.next;

quickSort(head,partition);

quickSort(partition,end);

// 题目要求不带头节点,返回结果时去除

return head.next;

}

}

HIGH23、子集

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

输入: nums = [1,2,3]

输出:

[

[3],

[1],

[2],

[1,2,3],

[1,3],

[2,3],

[1,2],

[]

]

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/subsets

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {

public List<List> subsets(int[] nums) {

List<List> res = new ArrayList<>();

res.add(new ArrayList<>());

for (int i = 0; i < nums.length; i++) {

int all = res.size();

for (int j = 0; j < all; j++) {

List tmp = new ArrayList<>(res.get(j));

tmp.add(nums[i]);

res.add(tmp);

}

}

return res;

}

}

HIGH24、全排列

给定一个 没有重复 数字的序列,返回其所有可能的全排列。

示例:

输入: [1,2,3]

输出:

[

[1,2,3],

[1,3,2],

[2,1,3],

[2,3,1],

[3,1,2],

[3,2,1]

]

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/permutations

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {

public List<List> permute(int[] nums) {

List<List> res = new ArrayList<>();

int[] visited = new int[nums.length];

backtrack(res, nums, new ArrayList(), visited);

return res;

}

private void backtrack(List<List> res, int[] nums, ArrayList tmp, int[] visited) {

if (tmp.size() == nums.length) {

res.add(new ArrayList<>(tmp));

return;

}

for (int i = 0; i < nums.length; i++) {

if (visited[i] == 1) continue;

visited[i] = 1;

tmp.add(nums[i]);

backtrack(res, nums, tmp, visited);

visited[i] = 0;

tmp.remove(tmp.size() - 1);

}

}

}

HIGH25、实现二叉树中序遍历(不使用递归)

给定一个二叉树的根节点 root ,返回它的 中序 遍历。

示例 1:

输入:root = [1,null,2,3]

输出:[1,3,2]

示例 2:

输入:root = []

输出:[]

示例 3:

输入:root = [1]

输出:[1]

示例 4:

输入:root = [1,2]

输出:[2,1]

示例 5:

输入:root = [1,null,2]

输出:[1,2]

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {

public List inorderTraversal(TreeNode root) {

List list = new ArrayList<>();

Stack stack = new Stack<>();

TreeNode cur = root;

while (cur != null || !stack.isEmpty()) {

if (cur != null) {

stack.push(cur);

cur = cur.left;

} else {

cur = stack.pop();

list.add(cur.val);

cur = cur.right;

}

}

return list;

}

}

}

HIGH26、爬楼梯(斐波那契数列)

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例 1:

输入: 2

输出: 2

解释: 有两种方法可以爬到楼顶。

1.  1 阶 + 1 阶

2.  2 阶

示例 2:

输入: 3

输出: 3

解释: 有三种方法可以爬到楼顶。

1.  1 阶 + 1 阶 + 1 阶

2.  1 阶 + 2 阶

3.  2 阶 + 1 阶

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/climbing-stairs

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

典型的动态规划题

class Solution {

// 执行用时 :0 ms, 在所有 Java 提交中击败了100.00%的用户内存消耗 :

// 33.2 MB, 在所有 Java 提交中击败了70.25%的用户

public int climbStairs(int n) {

if(n<=2){

return n;

}

int i1 = 1;

int i2 = 2;

for(int i=3;i<=n;i++){

int temp = i1+i2;

i1 = i2;

i2 = temp;

}

return i2;

}

}

HIGH27、滑动窗口的最大值

给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。

示例:

输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3

输出: [3,3,5,5,6,7]

解释:

滑动窗口的位置                最大值

---------------               -----

[1  3  -1] -3  5  3  6  7       3

最后

总而言之,Android开发行业变化太快,作为技术人员就要保持终生学习的态度,让学习力成为核心竞争力,所谓“活到老学到老”只有不断的学习,不断的提升自己,才能跟紧行业的步伐,才能不被时代所淘汰。

在这里我分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司20年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
  -----

[1  3  -1] -3  5  3  6  7       3

最后

总而言之,Android开发行业变化太快,作为技术人员就要保持终生学习的态度,让学习力成为核心竞争力,所谓“活到老学到老”只有不断的学习,不断的提升自己,才能跟紧行业的步伐,才能不被时代所淘汰。

在这里我分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司20年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

[外链图片转存中…(img-KETZy3pJ-1647529712243)]

[外链图片转存中…(img-OHYyoIGq-1647529712244)]

[外链图片转存中…(img-xNqO3O7l-1647529712244)]

还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值