Leetcode面T8(1-9)树,Android面试基础技能罗列

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

Q8.6 汉诺塔问题

在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:

(1) 每次只能移动一个盘子;

(2) 盘子只能从柱子顶端滑出移到下一根柱子;

(3) 盘子只能叠在比它大的盘子上。

请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。

你需要原地修改栈。

示例1:

输入:A = [2, 1, 0], B = [], C = []

输出:C = [2, 1, 0]

示例2:

输入:A = [1, 0], B = [], C = []

输出:C = [1, 0]

提示:

A中盘子的数目不大于14个。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/hanota-lcci

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

class Solution {

public void hanota(List A, List B, List C) {

move(A.size(), A, B, C);

}

void move(int n, List A, List B, List C) {

if (n == 1) {

C.add(A.remove(A.size() - 1));

} else {

B.add(A.remove(A.size() - 1));

move(n - 1, A, B, C); // 一处递归即可

C.add(B.remove(B.size() - 1));

}

}

}

Q8.7 无重复字符串的排列组合

无重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同。

示例1:

输入:S = “qwe”

输出:[“qwe”, “qew”, “wqe”, “weq”, “ewq”, “eqw”]

示例2:

输入:S = “ab”

输出:[“ab”, “ba”]

提示:

字符都是英文字母。

字符串长度在[1, 9]之间。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/permutation-i-lcci

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

回溯模板题

class Solution {

private boolean[] used;

/**

如果字符串有重复字母,最简单的去重是使用Set,也可以排序后下标剪枝(相对比较难)

重复字母的全排列可去做《全排列》系列题目。这道题好像和全排列I差不多。

接着要做的就是回溯模板啦,选了的跳过,每次选或不选即可爆搜到所有解。

*/

private List res;

private int len;

public String[] permutation(String S) {

len = S.length();

used = new boolean[len];

res = new ArrayList<>();

dfs(S, new StringBuilder(), 0);

return res.toArray(new String[0]);

}

private void dfs(String s, StringBuilder sb, int cnt) {

// end —— 当sb长度与s长度一致时结束,存储答案

if (cnt == len) {

res.add(sb.toString());

return;

}

// 回溯模板

for (int i = 0; i < len; i++) {

if (!used[i]) {

used[i] = true;

sb.append(s.charAt(i));

dfs(s, sb, cnt + 1);

used[i] = false;

sb.deleteCharAt(cnt);

}

}

}

}

Q8.8 有重复字符串的排列组合

有重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合。

示例1:

输入:S = “qqe”

输出:[“eqq”,“qeq”,“qqe”]

示例2:

输入:S = “ab”

输出:[“ab”, “ba”]

提示:

字符都是英文字母。

字符串长度在[1, 9]之间。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/permutation-ii-lcci

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

这个就是基本的dfs, 不过要注意去重,如果单纯用set则复杂度过高,这里可以直接写规则来过滤,下面简单说一下两种过滤方式,假设数据是aab(这里注意要给字符数组先排序再dfs)

1.arr[i] == arr[i - 1] && book[i - 1]: 该种情况是优先取右,举个简单例子,第一个我们从左到右是a,a,b,这种情况是不可取的,因为当到第二个a时候,第一个a已经用过了,正相反,当我们从第二个a开始的时候,取第一个字符也就是arr[0]=a还没用过,符合条件,故两个a,a,b只会存下来1个。

2.arr[i] == arr[i - 1] && !book[i - 1]: 这个跟第一种过滤方式刚好相反,不过多解释。

还有一种方法可以免去去重步骤,就是可以把字符装桶,然后对桶dfs,只要这个字符还没用完就继续递归下去,有兴趣的可以实现一下。

public String[] permutation(String S) {

List list = new ArrayList<>();

char[] arr = S.toCharArray();

Arrays.sort(arr);

boolean[] book = new boolean[arr.length];

dfs(list, new StringBuilder(), book, arr);

String[] res = new String[list.size()];

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

res[i] = list.get(i);

return res;

}

public void dfs(List res, StringBuilder sb, boolean[] book, char[] arr) {

if (sb.length() == arr.length) {

res.add(sb.toString());

return;

}

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

if (!book[i]) {

if (i > 0 && arr[i] == arr[i - 1] && !book[i - 1])

continue;

else {

sb.append(arr[i]);

book[i] = true;

dfs(res, sb, book, arr);

book[i] = false;

sb.deleteCharAt(sb.length() - 1);

}

}

}

}

Q8.9 括号

括号。设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合。

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

例如,给出 n = 3,生成结果为:

[

“((()))”,

“(()())”,

“(())()”,

“()(())”,

“()()()”

]

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/bracket-lcci

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

class Solution {

List result = new ArrayList();

public List generateParenthesis(int n) {

getAllResult(0, 0, n, new StringBuilder());

return result;

}

public void getAllResult(int pre, int last, int n, StringBuilder sb){

if(pre == n && last == n){

result.add(sb.toString());

return;

}

if(pre < n){

sb.append(‘(’);

getAllResult(pre + 1, last, n, sb);

sb.delete(sb.length() - 1, sb.length());

}

if(last < pre){

sb.append(‘)’);

getAllResult(pre, last + 1, n, sb);

sb.delete(sb.length() - 1, sb.length());

}

}

}

Q8.10  颜色填充

编写函数,实现许多图片编辑软件都支持的「颜色填充」功能。

待填充的图像用二维数组 image 表示,元素为初始颜色值。初始坐标点的横坐标为 sr 纵坐标为 sc。需要填充的新颜色为 newColor 。

「周围区域」是指颜色相同且在上、下、左、右四个方向上存在相连情况的若干元素。

请用新颜色填充初始坐标点的周围区域,并返回填充后的图像。

示例:

输入:

image = [[1,1,1],[1,1,0],[1,0,1]]

sr = 1, sc = 1, newColor = 2

输出:[[2,2,2],[2,2,0],[2,0,1]]

解释:

初始坐标点位于图像的正中间,坐标 (sr,sc)=(1,1) 。

初始坐标点周围区域上所有符合条件的像素点的颜色都被更改成 2 。

注意,右下角的像素没有更改为 2 ,因为它不属于初始坐标点的周围区域。

提示:

image 和 image[0] 的长度均在范围 [1, 50] 内。

初始坐标点 (sr,sc) 满足 0 <= sr < image.length 和 0 <= sc < image[0].length 。

image[i][j] 和 newColor 表示的颜色值在范围 [0, 65535] 内。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/color-fill-lcci

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

r代表row,c代表col,理解为x行x列

class Solution {

public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {

helper(image, sr, sc, image[sr][sc], newColor);

return image;

}

private void helper(int[][] image, int i, int j, int oldColor, int newColor){

if(i < 0 || i >= image.length || j < 0 || j >= image[0].length || image[i][j] != oldColor || image[i][j] == newColor) return;

image[i][j] = newColor;

helper(image, i+1, j, oldColor, newColor);

helper(image, i-1, j, oldColor, newColor);

helper(image, i, j+1, oldColor, newColor);

helper(image, i, j-1, oldColor, newColor);

}

}

Q8.11 硬币

硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)

示例1:

输入: n = 5

输出:2

解释: 有两种方式可以凑成总金额:

5=5

5=1+1+1+1+1

示例2:

输入: n = 10

输出:4

解释: 有四种方式可以凑成总金额:

10=10

10=5+5

10=5+1+1+1+1+1

10=1+1+1+1+1+1+1+1+1+1

说明:

注意:

你可以假设:

0 <= n (总金额) <= 1000000

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/coin-lcci

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

动态规划,每次小循环只用一种硬币。

若在一次for循环中处理四种情况(一个for里带四个硬币的处理情况),每次计算新一项时,由于每次取的硬币是任意的,会出现对于不同的硬币取法,情况重复的现象。 例如:n=15时,res[15] = 1(全1) + res[15 - 5] + res[15 - 10] = 7,但10 + 5和5 + 10是重复的。

每次小循环只用一种硬币可以避免重复,因为每次小循环中选用的硬币是固定的,在没有到对应硬币的循环前,表内记录对应的解必然不包含该硬币。 例如:n=15时,四次:res[15]=0 -> res[15] = 0 -> res[15] = 2 -> res[15] = 6

实际上coins数组升序也不会影响结果。

class Solution {

private final int mod = 1000000007;

private final int[] coins = {25,10,5,1};

public int waysToChange(int n) {

int[] res = new int[n + 1];

res[0] = 1;

for(int coin : coins){

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

res[i] = (res[i] + res[i - coin]) % mod;

}

}

return res[n];

}

}

Q8.12 八皇后

设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线上。这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。

注意:本题相对原题做了扩展

示例:

输入:4

输出:[[“.Q…”,“…Q”,“Q…”,“…Q.”],[“…Q.”,“Q…”,“…Q”,“.Q…”]]

解释: 4 皇后问题存在如下两个不同的解法。

[

[“.Q…”,  // 解法 1

“…Q”,

“Q…”,

“…Q.”],

[“…Q.”,  // 解法 2

“Q…”,

“…Q”,

“.Q…”]

]

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/eight-queens-lcci

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

N皇后本质上就是一个枚举问题,和全排列、组合什么的一个道理。枚举问题都可以考虑使用DFS来解决

class Solution {

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

public List<List> solveNQueens(int n) {

尾声

最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

进阶学习视频

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

进阶学习视频

[外链图片转存中…(img-5VOBf913-1713562905923)]

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-KeSOH3el-1713562905923)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-IoskglVa-1713562905924)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 16
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值