• 广东海颐开发笔试编程题回顾


    题目一

    1、现以序列{22, 24, 30, 14, 10, 17, 15, 20, 16, 23}的顺序进行输入,请画出构造出的平衡二叉树?请写出实现二叉树左旋的代码?(具体题目忘记了,就随机搞个排序,思路和方法都是一样的)

    顺序 {22, 14, 10, 17, 24, 30, 15, 20, 16, 23} 重新构建平衡二叉树如下:

    1. 22
    2. / \
    3. 14 24
    4. / \ \
    5. 10 17 30
    6. / \ /
    7. 15 20 16
    8. \
    9. 23

    判断对错以及平衡思路:

    1

    衡二叉树的定义是任何节点的两个子树的高度差不超过1。在这个树中,每个节点的左子树和右子树的高度差都不超过1,因此是平衡的。


    2

    合规性判断

    • 平衡性:该二叉树是平衡的,因为每个节点的左右子树高度差都不超过1。

    • 有序性:根据二叉搜索树(Binary Search Tree,BST)的性质,对于每个节点,其左子树上的所有节点都小于它,右子树上的所有节点都大于它。在这个树中,对于任何节点,其左子树上的节点值都小于该节点的值,右子树上的节点值都大于该节点的值,因此满足BST的有序性要求。

    • 所有节点都包含在树中:所有给定的节点 {22, 14, 10, 17, 24, 30, 15, 20, 16, 23} 都包含在这颗树中。

    因此,这个二叉树是合规的平衡二叉树(Balanced Binary Search Tree)。

    以下是实现二叉树左旋操作的Python代码示例:

    1. class TreeNode:
    2. def __init__(self, key):
    3. self.left = None
    4. self.right = None
    5. self.val = key
    6. def left_rotate(root):
    7. if root is None or root.right is None:
    8. return root
    9. new_root = root.right
    10. root.right = new_root.left
    11. new_root.left = root
    12. return new_root
    13. # 用于插入元素的辅助函数
    14. def insert(root, key):
    15. if root is None:
    16. return TreeNode(key)
    17. if key < root.val:
    18. root.left = insert(root.left, key)
    19. elif key > root.val:
    20. root.right = insert(root.right, key)
    21. return root
    22. # 中序遍历打印二叉树的辅助函数
    23. def inorder_traversal(root):
    24. if root:
    25. inorder_traversal(root.left)
    26. print(root.val, end=" ")
    27. inorder_traversal(root.right)
    28. # 创建一个示例树并插入一些元素
    29. root = None
    30. elements = [22, 14, 10, 17, 24, 30, 15, 20, 16, 23]
    31. for element in elements:
    32. root = insert(root, element)
    33. print("原始二叉树:")
    34. inorder_traversal(root)
    35. # 执行左旋操作
    36. new_root = left_rotate(root)
    37. print("\n左旋后的二叉树:")
    38. inorder_traversal(new_root)

    代码包括一个 left_rotate 函数,用于执行二叉树的左旋操作。我们首先构建了一个二叉树,然后对其执行左旋操作,并通过中序遍历来验证左旋操作的结果。左旋操作旋转了当前节点的右子树到当前节点的位置,从而改变了树的结构以保持平衡性。

    以下是Java中实现二叉树左旋操作的示例代码:

    1. class TreeNode {
    2. int val;
    3. TreeNode left;
    4. TreeNode right;
    5. public TreeNode(int val) {
    6. this.val = val;
    7. this.left = null;
    8. this.right = null;
    9. }
    10. }
    11. public class BinaryTree {
    12. // 左旋操作
    13. public TreeNode leftRotate(TreeNode root) {
    14. if (root == null || root.right == null) {
    15. return root;
    16. }
    17. TreeNode newRoot = root.right;
    18. root.right = newRoot.left;
    19. newRoot.left = root;
    20. return newRoot;
    21. }
    22. // 中序遍历打印二叉树
    23. public void inorderTraversal(TreeNode root) {
    24. if (root != null) {
    25. inorderTraversal(root.left);
    26. System.out.print(root.val + " ");
    27. inorderTraversal(root.right);
    28. }
    29. }
    30. // 插入元素到二叉树
    31. public TreeNode insert(TreeNode root, int key) {
    32. if (root == null) {
    33. return new TreeNode(key);
    34. }
    35. if (key < root.val) {
    36. root.left = insert(root.left, key);
    37. } else if (key > root.val) {
    38. root.right = insert(root.right, key);
    39. }
    40. return root;
    41. }
    42. public static void main(String[] args) {
    43. BinaryTree tree = new BinaryTree();
    44. TreeNode root = null;
    45. int[] elements = {22, 14, 10, 17, 24, 30, 15, 20, 16, 23};
    46. for (int element : elements) {
    47. root = tree.insert(root, element);
    48. }
    49. System.out.println("原始二叉树:");
    50. tree.inorderTraversal(root);
    51. // 执行左旋操作
    52. TreeNode newRoot = tree.leftRotate(root);
    53. System.out.println("\n左旋后的二叉树:");
    54. tree.inorderTraversal(newRoot);
    55. }
    56. }

    画图思路:

    1. 首先,根据给定的元素序列构建初始的二叉树结构。根据题目的要求逐个插入元素来构建二叉树。

    2. 在每一步插入元素之后,观察树的结构并确定是否需要执行左旋操作。通常,左旋操作是在插入元素后,树的右子树的高度比左子树的高度大于1时执行。

    3. 如果需要执行左旋操作,找到需要旋转的节点,然后执行左旋操作,将右子树旋转到当前节点的位置。

    4. 重复步骤2和步骤3,直到所有元素都被插入并且树保持平衡。

    代码思路:

    1. 创建一个二叉树节点类 TreeNode,其中包括节点值、左子树和右子树的引用。

    2. 创建一个二叉树类 BinaryTree,其中包括左旋操作的方法 leftRotate、插入元素的方法 insert,以及中序遍历打印树的方法 inorderTraversal

    3. insert 方法中,按照给定的顺序逐个插入元素,插入后检查树的平衡情况,如果需要执行左旋操作,则执行左旋操作。

    4. leftRotate 方法中,执行左旋操作。将当前节点的右子树提升为新的根节点,调整子树的连接。

    5. main 方法中,创建一个空树并插入元素来构建初始的二叉树。

    6. 执行左旋操作并使用中序遍历打印原始二叉树和左旋后的二叉树,以验证左旋操作的正确性。

    题目二

    给定整数n,返回所有小于非负整数n的质数的数量

    示例1:

    输入:n=1

    输出: 4

    解释:小于10的质数一共有4个,它们是2,3,5,7。

    示例2: 输入: n=0

    输出: 0

    示例3:

    输入:n=1

    输出: 0

    代码

    就是判断质数问题,本人当时脑子有点乱,写的代码有些问题

    1. public class CountPrimes {
    2. public int countPrimes(int n) {
    3. if (n <= 2) {
    4. return 0;
    5. }
    6. boolean[] isPrime = new boolean[n];
    7. // 初始化所有数字为质数
    8. for (int i = 2; i < n; i++) {
    9. isPrime[i] = true;
    10. }
    11. // 使用埃拉托斯特尼筛法找出质数
    12. for (int i = 2; i * i < n; i++) {
    13. if (isPrime[i]) {
    14. for (int j = i * i; j < n; j += i) {
    15. isPrime[j] = false;
    16. }
    17. }
    18. }
    19. // 统计质数的数量
    20. int count = 0;
    21. for (int i = 2; i < n; i++) {
    22. if (isPrime[i]) {
    23. count++;
    24. }
    25. }
    26. return count;
    27. }
    28. public static void main(String[] args) {
    29. CountPrimes solution = new CountPrimes();
    30. System.out.println(solution.countPrimes(10)); // 输出 4
    31. System.out.println(solution.countPrimes(0)); // 输出 0
    32. System.out.println(solution.countPrimes(1)); // 输出 0
    33. }
    34. }

    题目三

    给定一组非负整数nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

    注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

    示例1:

    输入: nums = [10,2]

    输出:”210”

    示例2:

    输入: nums = [3, 30,34, 5,9]

    输出: "9534330”

    代码:

    1. class LargerNumberComparator(str):
    2. def __lt__(x, y):
    3. return x + y > y + x
    4. def largestNumber(nums):
    5. # 将数字转换为字符串并按照自定义比较规则进行排序
    6. nums = sorted(map(str, nums), key=LargerNumberComparator)
    7. # 如果排序后的第一个数字是0,则整个结果是0
    8. if nums[0] == '0':
    9. return '0'
    10. # 否则,将排序后的数字连接起来得到最大的整数
    11. return ''.join(nums)
    12. # 示例1
    13. nums1 = [10, 2]
    14. result1 = largestNumber(nums1)
    15. print(result1) # 输出: "210"
    16. # 示例2
    17. nums2 = [3, 30, 34, 5, 9]
    18. result2 = largestNumber(nums2)
    19. print(result2) # 输出: "9534330"

    代码

    1. import java.util.Arrays;
    2. import java.util.Comparator;
    3. public class LargestNumber {
    4. public String largestNumber(int[] nums) {
    5. // 将数字转换为字符串并按照自定义比较规则进行排序
    6. String[] numStrs = new String[nums.length];
    7. for (int i = 0; i < nums.length; i++) {
    8. numStrs[i] = String.valueOf(nums[i]);
    9. }
    10. Arrays.sort(numStrs, new LargerNumberComparator());
    11. // 如果排序后的第一个数字是0,则整个结果是0
    12. if (numStrs[0].equals("0")) {
    13. return "0";
    14. }
    15. // 否则,将排序后的数字连接起来得到最大的整数
    16. StringBuilder result = new StringBuilder();
    17. for (String numStr : numStrs) {
    18. result.append(numStr);
    19. }
    20. return result.toString();
    21. }
    22. private class LargerNumberComparator implements Comparator {
    23. @Override
    24. public int compare(String a, String b) {
    25. String order1 = a + b;
    26. String order2 = b + a;
    27. return order2.compareTo(order1);
    28. }
    29. }
    30. public static void main(String[] args) {
    31. LargestNumber solution = new LargestNumber();
    32. int[] nums1 = {10, 2};
    33. System.out.println(solution.largestNumber(nums1)); // 输出: "210"
    34. int[] nums2 = {3, 30, 34, 5, 9};
    35. System.out.println(solution.largestNumber(nums2)); // 输出: "9534330"
    36. }
    37. }

    输入测试:这样改

  • 相关阅读:
    线上问题处理案例:出乎意料的数据库连接池
    RabbitMQ入门指南
    串口通信原理及应用
    【虹科干货】Redis Enterprise 自动分层技术:大数据集高性能解决方案
    java----IO流:字符流
    信息安全服务资质CCRC和信息安全管理体系ISO27001有什么区别?
    Linux——进程控制(一)进程的创建与退出
    使用ffmpeg提取视频中的音频并保存为单声道wav
    用友vs金蝶产品分析(云星空与YonSuite)
    uni-app 微信小程序支付/公众号支付/h5支付宝/h5微信/支付宝app支付/微信app支付
  • 原文地址:https://blog.csdn.net/qq_57747969/article/details/133325593