返回

逆向思维巧解前端算法难题,从初级入门到进阶实战,一步步攻克十道高频题目!

前端

最近,我在 GitHub 上发现了一系列有趣的前端算法题,我决定尝试解决它们。在经历一番头脑风暴之后,我成功地破解了其中的十道难题。现在,让我与您分享我的收获和心得,希望对您有所启发。

1. 数字转中文

这个题目的目标是将一个阿拉伯数字转换成中文大写。例如,输入 12345,输出应为 一万二千三百四十五

为了解决这个问题,我使用了一个 switch-case 语句来逐个处理数字。然后,我使用了 StringBuilder 来构建输出的中文大写。

2. 数组交集

给定两个数组,arr1arr2,找出它们的交集。例如,如果 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,找出 substrstr 中出现的次数。例如,如果 str = "abababa"substr = "aba",那么 substrstr 中出现的次数是 3

为了解决这个问题,我使用了 KMP 算法。这个算法使用一个特殊的预处理表来构建一个新的字符串,然后使用动态规划来查找 substrstr 中出现的所有位置。

以上是我的收获和心得,希望对您有所启发。如果您有任何问题或建议,请随时与我联系。