逆向思维巧解前端算法难题,从初级入门到进阶实战,一步步攻克十道高频题目!
2023-12-23 11:27:35
最近,我在 GitHub 上发现了一系列有趣的前端算法题,我决定尝试解决它们。在经历一番头脑风暴之后,我成功地破解了其中的十道难题。现在,让我与您分享我的收获和心得,希望对您有所启发。
1. 数字转中文
这个题目的目标是将一个阿拉伯数字转换成中文大写。例如,输入 12345
,输出应为 一万二千三百四十五
。
为了解决这个问题,我使用了一个 switch-case
语句来逐个处理数字。然后,我使用了 StringBuilder
来构建输出的中文大写。
2. 数组交集
给定两个数组,arr1
和 arr2
,找出它们的交集。例如,如果 arr1 = [1, 2, 3, 4, 5]
和 arr2 = [3, 4, 5, 6, 7]
, 那么它们的交集就是 [3, 4, 5]
。
为了解决这个问题,我使用了 Set
数据结构来存储 arr1
中的元素。然后,我遍历 arr2
,并检查每个元素是否在 Set
中。如果在,我就将它添加到交集中。
3. 数组去重
给定一个数组,arr
,找出它的去重后的元素。例如,如果 arr = [1, 2, 3, 4, 5, 1, 2, 3]
, 那么它的去重后的元素就是 [1, 2, 3, 4, 5]
。
为了解决这个问题,我使用了 Set
数据结构来存储 arr
中的元素。然后,我遍历 Set
,并将它的元素添加到去重后的数组中。
4. 数组中最大值
给定一个数组,arr
,找出它的最大值。例如,如果 arr = [1, 2, 3, 4, 5]
, 那么它的最大值就是 5
。
为了解决这个问题,我使用了一个 for
循环来遍历数组。在每次迭代中,我将当前元素与最大值进行比较,并更新最大值。
5. 数组中最小值
给定一个数组,arr
,找出它的最小值。例如,如果 arr = [1, 2, 3, 4, 5]
, 那么它的最小值就是 1
。
为了解决这个问题,我使用了一个 for
循环来遍历数组。在每次迭代中,我将当前元素与最小值进行比较,并更新最小值。
6. 数组排序
给定一个数组,arr
,对它进行排序。例如,如果 arr = [1, 5, 3, 2, 4]
, 那么它的排序结果就是 [1, 2, 3, 4, 5]
.
为了解决这个问题,我使用了 arr.sort()
方法对数组进行排序。
7. 链表反转
给定一个链表,head
,将其反转。例如,如果 head = 1 -> 2 -> 3 -> 4 -> 5
, 那么它的反转结果就是 5 -> 4 -> 3 -> 2 -> 1
.
为了解决这个问题,我使用了一个 while
循环来遍历链表。在每次迭代中,我将当前节点的 next
指向 prev
,并将 prev
更新为当前节点。
8. 二叉树遍历
给定一个二叉树,root
,对其进行深度优先搜索(DFS)遍历。例如,如果 root
是以下二叉树,那么它的 DFS 遍历结果就是 1, 2, 4, 5, 3
.
1
/ \
2 3
/ \
4 5
为了解决这个问题,我使用了递归来遍历二叉树。在每次递归中,我访问当前节点,然后递归地遍历它的左子树和右子树。
9. 查找字符串中的最长回文子串
给定一个字符串,str
,找出它的最长回文子串。例如,如果 str = "babad"
, 那么它的最长回文子串就是 "bab"
。
为了解决这个问题,我使用了 Manacher
算法。这个算法使用一个特殊的预处理字符串来构建一个新的字符串,然后使用动态规划来查找最长回文子串。
10. 查找子字符串在字符串中出现的次数
给定一个字符串,str
,和一个子字符串,substr
,找出 substr
在 str
中出现的次数。例如,如果 str = "abababa"
和 substr = "aba"
,那么 substr
在 str
中出现的次数是 3
。
为了解决这个问题,我使用了 KMP
算法。这个算法使用一个特殊的预处理表来构建一个新的字符串,然后使用动态规划来查找 substr
在 str
中出现的所有位置。
以上是我的收获和心得,希望对您有所启发。如果您有任何问题或建议,请随时与我联系。