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

news2024/10/7 20:34:04

题目一

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

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

       22
      /   \
    14     24
   /  \      \
 10   17     30
      / \      / 
     15 20   16
              \
               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代码示例:

class TreeNode:
    def __init__(self, key):
        self.left = None
        self.right = None
        self.val = key

def left_rotate(root):
    if root is None or root.right is None:
        return root

    new_root = root.right
    root.right = new_root.left
    new_root.left = root
    return new_root

# 用于插入元素的辅助函数
def insert(root, key):
    if root is None:
        return TreeNode(key)
    
    if key < root.val:
        root.left = insert(root.left, key)
    elif key > root.val:
        root.right = insert(root.right, key)
    
    return root

# 中序遍历打印二叉树的辅助函数
def inorder_traversal(root):
    if root:
        inorder_traversal(root.left)
        print(root.val, end=" ")
        inorder_traversal(root.right)

# 创建一个示例树并插入一些元素
root = None
elements = [22, 14, 10, 17, 24, 30, 15, 20, 16, 23]

for element in elements:
    root = insert(root, element)

print("原始二叉树:")
inorder_traversal(root)

# 执行左旋操作
new_root = left_rotate(root)

print("\n左旋后的二叉树:")
inorder_traversal(new_root)

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

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

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    public TreeNode(int val) {
        this.val = val;
        this.left = null;
        this.right = null;
    }
}

public class BinaryTree {
    // 左旋操作
    public TreeNode leftRotate(TreeNode root) {
        if (root == null || root.right == null) {
            return root;
        }

        TreeNode newRoot = root.right;
        root.right = newRoot.left;
        newRoot.left = root;
        return newRoot;
    }

    // 中序遍历打印二叉树
    public void inorderTraversal(TreeNode root) {
        if (root != null) {
            inorderTraversal(root.left);
            System.out.print(root.val + " ");
            inorderTraversal(root.right);
        }
    }

    // 插入元素到二叉树
    public TreeNode insert(TreeNode root, int key) {
        if (root == null) {
            return new TreeNode(key);
        }

        if (key < root.val) {
            root.left = insert(root.left, key);
        } else if (key > root.val) {
            root.right = insert(root.right, key);
        }

        return root;
    }

    public static void main(String[] args) {
        BinaryTree tree = new BinaryTree();
        TreeNode root = null;
        int[] elements = {22, 14, 10, 17, 24, 30, 15, 20, 16, 23};

        for (int element : elements) {
            root = tree.insert(root, element);
        }

        System.out.println("原始二叉树:");
        tree.inorderTraversal(root);

        // 执行左旋操作
        TreeNode newRoot = tree.leftRotate(root);

        System.out.println("\n左旋后的二叉树:");
        tree.inorderTraversal(newRoot);
    }
}

画图思路:

  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

代码

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

public class CountPrimes {
    public int countPrimes(int n) {
        if (n <= 2) {
            return 0;
        }

        boolean[] isPrime = new boolean[n];
        // 初始化所有数字为质数
        for (int i = 2; i < n; i++) {
            isPrime[i] = true;
        }

        // 使用埃拉托斯特尼筛法找出质数
        for (int i = 2; i * i < n; i++) {
            if (isPrime[i]) {
                for (int j = i * i; j < n; j += i) {
                    isPrime[j] = false;
                }
            }
        }

        // 统计质数的数量
        int count = 0;
        for (int i = 2; i < n; i++) {
            if (isPrime[i]) {
                count++;
            }
        }

        return count;
    }

    public static void main(String[] args) {
        CountPrimes solution = new CountPrimes();
        System.out.println(solution.countPrimes(10)); // 输出 4
        System.out.println(solution.countPrimes(0));  // 输出 0
        System.out.println(solution.countPrimes(1));  // 输出 0
    }
}

题目三

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

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

示例1:

输入: nums = [10,2]

输出:”210”

示例2:

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

输出: "9534330”

代码:

class LargerNumberComparator(str):
    def __lt__(x, y):
        return x + y > y + x

def largestNumber(nums):
    # 将数字转换为字符串并按照自定义比较规则进行排序
    nums = sorted(map(str, nums), key=LargerNumberComparator)
    # 如果排序后的第一个数字是0,则整个结果是0
    if nums[0] == '0':
        return '0'
    # 否则,将排序后的数字连接起来得到最大的整数
    return ''.join(nums)

# 示例1
nums1 = [10, 2]
result1 = largestNumber(nums1)
print(result1)  # 输出: "210"

# 示例2
nums2 = [3, 30, 34, 5, 9]
result2 = largestNumber(nums2)
print(result2)  # 输出: "9534330"

代码

import java.util.Arrays;
import java.util.Comparator;

public class LargestNumber {
    public String largestNumber(int[] nums) {
        // 将数字转换为字符串并按照自定义比较规则进行排序
        String[] numStrs = new String[nums.length];
        for (int i = 0; i < nums.length; i++) {
            numStrs[i] = String.valueOf(nums[i]);
        }

        Arrays.sort(numStrs, new LargerNumberComparator());

        // 如果排序后的第一个数字是0,则整个结果是0
        if (numStrs[0].equals("0")) {
            return "0";
        }

        // 否则,将排序后的数字连接起来得到最大的整数
        StringBuilder result = new StringBuilder();
        for (String numStr : numStrs) {
            result.append(numStr);
        }

        return result.toString();
    }

    private class LargerNumberComparator implements Comparator<String> {
        @Override
        public int compare(String a, String b) {
            String order1 = a + b;
            String order2 = b + a;
            return order2.compareTo(order1);
        }
    }

    public static void main(String[] args) {
        LargestNumber solution = new LargestNumber();
        int[] nums1 = {10, 2};
        System.out.println(solution.largestNumber(nums1));  // 输出: "210"

        int[] nums2 = {3, 30, 34, 5, 9};
        System.out.println(solution.largestNumber(nums2));  // 输出: "9534330"
    }
}

输入测试:这样改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1044528.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】多态,从使用到底层。

文章目录 前言一、多态的概念二、多太的定义和实现2.1 多太的构造条件2.2 虚函数2.3 重写(覆盖)2.4 C11 override 和 final2.5 重载&#xff0c;隐藏&#xff0c;重写 三、多态的原理3. 1虚函数表3.2 虚函数表如何完成多态的功能3.3 虚函数表存储在内存空间的那个区域&#xff…

服务断路器_Resilience4j超时降级

创建模块cloud-consumer-resilience4j-order80 POM引入依赖 <dependencies><!-- 引入Eureka 客户端依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</a…

【Java 进阶篇】数据库介绍与MySQL详细介绍

数据库是信息科技领域中不可或缺的一部分&#xff0c;它们在我们日常生活中扮演着重要的角色&#xff0c;从手机应用到云计算&#xff0c;无处不在。在本篇博客中&#xff0c;我们将深入探讨数据库的基本概念以及MySQL这一流行的开源关系型数据库的详细信息。不需要数据库专业知…

AI写作生成器-AI写作生成器下载和用途

在当今数字化的时代&#xff0c;AI写作生成器已经成为了各行各业的创作者、企业家和学生的得力助手。这些智能工具以其强大的自然语言处理技术&#xff0c;正在解决着许多用户的写作难题。本文将深入探讨AI写作生成器&#xff0c;以及它如何在不同领域解决用户的写作问题。 147…

【算法分析与设计】递归与分治策略

目录 一、学习要点二、算法总体思想三、递归的概念例1 阶乘函数例2 Fibonacci数列例3 Ackerman函数例4 整数划分问题例5 Hanoi塔问题递归小结 四、分治法1、分治法的适用条件2、二分搜索技术3、大整数的乘法4、Strassen矩阵乘法5、棋盘覆盖6、合并排序7、快速排序8、线性时间选…

嵌入式 - 经典的有刷电机和先进的无刷电机

自从无刷直流电机诞生&#xff0c;“古老的”有刷电机就开始没落&#xff0c;但它依然是低成本应用的可靠选择&#xff0c;并且实现起来简单。 在有刷电机中&#xff0c;磁极方向的跳转是通过移动固定位置的接触点来完成的&#xff0c;该接触点在电机转子上与电触点相对连接。这…

无法从 /var/lib/rpm 打开软件包数据库

使用yum命令安装软件包时&#xff0c;报错“无法从 /var/lib/rpm 打开软件包数据库” 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.原因 是误操作导致 rpm 数据库损坏。&#xff08;/var/lib/rpm 目录下的文件被损坏&#xff09; 2.解决 当RPM 数据库发生损坏&a…

【SAP后台配置】如何通过前台屏幕字段找到对应SPRO后台路径?

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;阿里云社区专家博主&#xff0c;华为云云享专家&#xff0c;腾讯云社区认证作者&#xff0c;CSDN SAP应用技术领域优质创作者。在学习工作中&#xff0c;我通常使用偏后端的开发语言ABAP&#xff0c;SQL进行任务的完成…

C++,对象赋值与对象拷贝的区别、深浅拷贝

在C中&#xff0c;对象赋值和对象拷贝是两个不同的操作&#xff0c;它们有明显的区别&#xff1a; 1. 对象赋值&#xff08;Object Assignment&#xff09;&#xff1a; - 对象赋值是指将一个已经存在的对象的值复制给另一个已经存在的对象。这通常通过赋值操作符&#xff08;…

分布式事务处理:挑战与解决方案

在当今的大数据时代&#xff0c;数据的处理和管理变得越来越复杂。特别是在分布式系统中&#xff0c;如何保证数据的一致性和完整性&#xff0c;是一个巨大的挑战。这就引出了我们今天要探讨的主题——分布式事务处理。分布式事务处理是一种技术&#xff0c;它能够在分布式系统…

【数据结构与算法】链表的实现以及一些基本算法

目录 单选链表的基本实现 有序列表的合并&#xff08;双指针法&#xff09; 链表的反转 链表实现两数之和 判定链表是否有环 单选链表的基本实现 public class LinkedList1 {//头节点Node first;//尾节点Node last;//大小int size 0;//头插法public void addFirst(int…

Springboot 前后端分离项目使用 POI 生成并导出 Excel

在做一个 SpringBoot 前后端分离项目的时候&#xff0c;需要将数据存到 Excel中&#xff0c;用户可以下载 Excel。具体实现是采用 Apache 强大的 POI。文章最后将源码例出。 POI API 文档&#xff1a; https://poi.apache.org/apidocs/dev/index.html 步骤 导入 POI 的 maven …

前端面试:01.图中输入什么?

~~~~~~~~~~~~~ 先自行想一想&#xff0c;答案在~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ 先自行想一想&#xff0c;答案在~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ 先自行想一想&#xff0c;答案在~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ 先自行想一想&#xff0c;答案在~~~~~~~~~~~~~~~~~ ~~~~~~~~…

大数据Flink(九十一):Array Expansion(数组列转行)和Table Function(自定义列转行)

文章目录 Array Expansion(数组列转行)和Table Function(自定义列转行)

Vue系列(二)之 基础语法上篇【插值,指令,过滤器,计算属性监听属性】以及购物车实现

目录 一. 插值 1.1 文本 1.2 原始HTML 1.3 属性 1.4 表达式 二. 指令 2.1 v-if/v-else-if/v-else指令 2.2 v-show指令 2.3 v-for指令 2.4 下拉框/复选框 2.5 动态参数 三. 过滤器 3.1 局部过滤器基本应用 3.2 局部过滤器串行使用 3.3 局部过滤器传参 3.4 全局过…

华为云云耀云服务器L实例评测 | 实例使用教学之简单使用:通过部署宝塔面板可视化管理华为云云耀云服务器

华为云云耀云服务器L实例评测 &#xff5c; 实例使用教学之简单使用&#xff1a;通过部署宝塔面板可视化管理华为云云耀云服务器 介绍华为云云耀云服务器 华为云云耀云服务器 &#xff08;目前已经全新升级为 华为云云耀云服务器L实例&#xff09; 华为云云耀云服务器是什么华为…

遥遥领先喊得再大声也没用了,美企领先优势越发明显,无奈的现实

遥遥领先已成为这一段时间特殊的口号&#xff0c;然而口号终究代替不了现实&#xff0c;在广受关注的两个行业--汽车和手机市场&#xff0c;都显示出真正遥遥领先的其实是美企&#xff0c;后来者已越发难以追赶了。 在手机行业&#xff0c;苹果饱受诟病&#xff0c;又是镜头进灰…

Nginx之memcached_module模块解读

目录 基本介绍 安装添加模块 模块配置指令 基本介绍 nginx的memcached_module模块可以直接从memcached服务器中读取内容后输出&#xff0c;后续的请求不再经过应用程序处理&#xff0c;如php-fpm、django&#xff0c;大大的提升动态页面的速度。nginx只负责从memcach…

STM32 UART通信协议 基础知识

通用异步收发器&#xff08;Universal Asynchronous Receiver/Transmitter)&#xff0c;通常称作UART&#xff0c;是一种串行、异步、全双工的通信协议。 在通信领域中&#xff0c;有两种数据通信方式&#xff1a;并行通信和串行通信。串口的数据传输是以串行方式进行的。串口在…

libtorch之tensor的使用

1. tensor的创建 tensor的创建有三种常用的形式&#xff0c;如下所示 ones创建一个指定维度&#xff0c;数据全为1的tensor. 例子中的维度是2维&#xff0c;5行3列。 torch::Tensor t torch::ones({5,3}); zeros创建一个指定维度&#xff0c;数据全为0的tensor&#xff0c;例子…