华为研发工程师编程题——明明的随机数

news2025/1/5 11:31:49
题目

[编程题]明明的随机数——来自牛客的华为研发工程师编程题,难度:🌟🌟🌟🌟
对于明明生成的 n 个 1 到 500 之间的随机整数,你需要帮助他完成以下任务:
∙删去重复的数字,即相同的数字只保留一个,把其余相同的数去掉;
∙然后再把这些数从小到大排序,按照排好的顺序输出。
你只需要输出最终的排序结果。
输入描述:
第一行输入一个整数 n (1≦n≦1000),代表明明生成的数字个数。
此后 n 行,第 i 行输入一个整数 ai (1≦ai ≦500),代表明明生成的随机整数。
输出描述:
输出若干行,每行输出一个整数,代表输入数据排序后的结果。第一行输出最小的数字。
示例1
输入

3
2
2
1

输出

1
2

解题
数组+插入排序

由于一开始没想起插入排序最好用链表来做,所以先写了数组版,思路如下:

  1. 读取输入的第一行,获得随机整数的总数
  2. 新建一个空数组nums,用来收集各输入数,存入nums的元素要遵循递增(即从小到大、不允许重复)的规则
  3. ACM输入的第一个整数存入nums第一位,后面的输入数逐个插入nums或被去重,直到处理完所有输入数。每次处理输入数都遵循以下处理流程:
    1. 处理流程第一步,读取下一个输入数作为新的待插入元素newNum,选取nums最后一个元素作为新的被比较元素compareNum,比较newNum与compareNum的大小
    2. newNum = compareNum,说明newNum是重复的数字,不必保留。回到处理流程第一步
    3. newNum > compareNum,则newNum大于compareNum及其左边的所有数,应把newNum插入nums中当前compareNum的后一位(nums.splice(compareNum的index + 1, 0, newNum))。回到处理流程第一步
    4. newNum < compareNum,且compareNum是nums中的第一位,说明newNum比nums中所有元素都要小,应把newNum插入nums的第一位(nums.unshift(newNum))。回到处理流程第一步
    5. newNum < compareNum,且compareNum不是nums中的第一位,说明newNum如果要插入的话,它的索引会比compareNum的索引更小,但还不知道具体是多少。应选取当前compareNum的前一位作为新的compareNum。回到处理流程第二步
  4. 处理完所有输入数后,nums就是一个包含所有输入数的数值且按递增顺序排列的数组了,现在遍历nums并打印出来。
const readline = require("readline");

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});
const inputLines = [];
rl.on("line", function (line: string) {
    inputLines.push(line.trim());
});
rl.on("close", function () {
    const numsLength = parseInt(inputLines[0]);
    // 数组nums是递增序列
    const nums = [];
    nums.push(parseInt(inputLines[1]));
    // 遍历输入数
    // 若新输入数按顺序插入了nums,或与已有元素重合了,则处理下一个输入数
    for (let newNumIdx = 2; newNumIdx <= numsLength; newNumIdx++) {
        const newNum = parseInt(inputLines[newNumIdx]);
        // 遍历nums
        let compareNumIdx = nums.length - 1;
        while (compareNumIdx >= 0) {
            const compareNum = nums[compareNumIdx];
            if (newNum === compareNum) {
            	// 退出nums遍历,去读取下一个输入数
                break;
            } else if (newNum > compareNum) {
            	// 插入新元素
                nums.splice(compareNumIdx + 1, 0, newNum);
                // 退出nums遍历,去读取下一个输入数
                break;
            } else {
                if (compareNumIdx === 0) {
                	// 在队首插入新元素
                    nums.unshift(newNum);
                    // 退出nums遍历,去读取下一个输入数
                	break;
                } else {
                	// 选取原被比较数的前一位作为新被比较数
                	compareNumIdx--;
                }
            }
        }
    }
    nums.forEach((num) => {
        console.log(num);
    });
});

遇到的问题:

  1. ACM输入问题一定要记得把输入字符串中的数字部份转为整数类型,否则把数字字符串当数字使用会出问题。比如1000>2是对的,但’1000’>'2’是错的,如果按从小到大排,程序会把’1000’排在’2’的前面。
  2. 流程比较复杂,主要是要熟悉插入排序的实现。
  3. 各循环的灵活度排名:while > for > forEach/map。
    如果想从数组的非开头元素开始遍历,或在非结尾元素结束遍历,或希望每次跳过一个元素,则for比forEach更方便控制。若循环中不同条件下索引可能增加n也可能减少n(最好别这样),则while比for更方便控制。
    视情况选择用哪种,一般用for循环。
链表+插入排序
const readline = require("readline");

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});
const inputLines = [];
class LineNode {
	val?: number; // default:public
   	next: LineNode | null = null;
   	last: LineNode | null = null;
	constructor(val?: number) {
		this.val = val;
		this.next = null;
		this.last = null;
	}
}
rl.on("line", function (line: string) {
    inputLines.push(line.trim());
});
rl.on("close", function () {
    const numsLength = parseInt(inputLines[0]);
    // 递增序列
    const lineHeadNode = new LineNode();

    // 遍历输入数
    // 若新输入数按顺序插入了nums,或与已有元素重合了,则处理下一个输入数
    for (let newNumIdx = 2; newNumIdx <= numsLength; newNumIdx++) {
        const newNum = parseInt(inputLines[newNumIdx]);
        // 遍历nums
        let compareNumIdx = nums.length - 1;
        while (lineHeadNode.last.) {
            const compareNum = nums[compareNumIdx];
            if (newNum === compareNum) {
            	// 退出nums遍历,去读取下一个输入数
                break;
            } else if (newNum > compareNum) {
            	// 插入新元素
                nums.splice(compareNumIdx + 1, 0, newNum);
                // 退出nums遍历,去读取下一个输入数
                break;
            } else {
                if (compareNumIdx === 0) {
                	// 在队首插入新元素
                    nums.unshift(newNum);
                    // 退出nums遍历,去读取下一个输入数
                	break;
                } else {
                	// 选取原被比较数的前一位作为新被比较数
                	compareNumIdx--;
                }
            }
        }
    }
    nums.forEach((num) => {
        console.log(num);
    });
});

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

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

相关文章

电脑dll文件丢失怎么恢复,丢失dll文件一键修复教程分享

动态链接库文件&#xff08;DLL&#xff09;是Windows操作系统中至关重要的组成部分&#xff0c;它们包含了许多程序运行所需的函数和资源。当电脑丢失DLL文件时&#xff0c;会导致软件无法正常运行&#xff0c;甚至影响系统的稳定性。本文将从多个角度全面分析解读电脑丢失DLL…

Vue项目整合与优化

前几篇文章&#xff0c;我们讲述了 Vue 项目构建的整体流程&#xff0c;从无到有的实现了单页和多页应用的功能配置&#xff0c;但在实现的过程中不乏一些可以整合的功能点及可行性的优化方案&#xff0c;就像大楼造完需要进行最后的项目验收改进一样&#xff0c;有待我们进一步…

面向机器学习的Java库与平台

学习Java语言中与机器学习相关的各种库与平台&#xff0c;了解每个库的功能&#xff0c;以及可以用它 们解决的问题。  实现机器学习应用时需要具备的Java环境  Weka&#xff1a;一个通用的机器学习平台  Java机器学习库&#xff1a;一系列机器学习算法  Apache Mah…

SAP SD学习笔记24 - 赠品的两种形式 - 内增Bonus数量、外增Bonus数量

上一章讲了无偿出荷的内容。 SAP SD学习笔记23 - 无偿出荷&#xff08;免费交货&#xff09;与继续无偿出荷&#xff08;继续免费交货&#xff09;-CSDN博客 本章继续将SAP中赠品的两种形式&#xff1a; - 内增Bonus数量&#xff1a;Bonus数量包含在总数量当中&#xff0c;比…

Python跨年烟花

目录 系列文章 写在前面 技术需求 完整代码 下载代码 代码分析 1. 程序初始化与显示设置 2. 烟花类 (Firework) 3. 粒子类 (Particle) 4. 痕迹类 (Trail) 5. 烟花更新与显示 6. 主函数 (fire) 7. 游戏循环 8. 总结 注意事项 写在后面 系列文章 序号直达链接爱…

深入理解MemCache

随着互联网应用的飞速发展&#xff0c;动态Web应用的性能问题逐渐成为开发者关注的焦点。其中&#xff0c;数据库作为系统性能的关键瓶颈&#xff0c;在用户请求量急剧增加的情况下&#xff0c;往往难以快速响应用户需求。为了解决这一问题&#xff0c;缓存技术应运而生。MemCa…

webrtc 源码阅读 make_ref_counted模板函数用法

目录 1. 模板参数解析 1.1 typename T 1.2 typename... Args 1.3 typename std::enable_if::value, T>::type* nullptr 2. scoped_refptr 3. new RefCountedObject(std::forward(args)...); 4. 综合说明 5.在webrtc中的用法 5.1 peerConnectionFactory对象的构建过…

【MySQL】数据操作

数据操作 一、INSERT1、介绍2、语法3、语法介绍4、注意事项5、示例 二、插入否则更新1、介绍2、语法3、语法介绍4、示例 三、ROW_COUNT1、介绍2、示例 四、REPLACE1、介绍2、语法3、示例 五、UPDATE1、介绍2、语法3、示例 六、DELETE1、介绍2、语法3、语法介绍 七、TRUNCATE1、…

表单元素(标签)有哪些?

HTML 中的表单元素&#xff08;标签&#xff09;用于收集用户输入的数据&#xff0c;常见的有以下几种&#xff1a; 文本输入框 <input type"text">&#xff1a;用于单行文本输入&#xff0c;如用户名、密码等。可以通过设置maxlength属性限制输入字符数&…

基于W2605C语音识别合成芯片的智能语音交互闹钟方案-AI对话享受智能生活

随着科技的飞速发展&#xff0c;智能家居产品正逐步渗透到我们的日常生活中&#xff0c;其中智能闹钟作为时间管理的得力助手&#xff0c;也在不断进化。基于W2605C语音识别与语音合成芯片的智能语音交互闹钟&#xff0c;凭借其强大的联网能力、自动校时功能、实时天气获取、以…

机器学习中回归预测模型中常用四个评价指标MBE、MAE、RMSE、R2解释

在机器学习中&#xff0c;评估模型性能时常用的四个指标包括平均绝对误差&#xff08;Mean Absolute Error, MAE&#xff09;、均方误差&#xff08;Mean Squared Error, MSE&#xff09;、均方根误差&#xff08;Root Mean Squared Error, RMSE&#xff09;和决定系数&#xf…

Visual Studio 玩转 IntelliCode AI辅助开发

&#x1f380;&#x1f380;&#x1f380;【AI辅助编程系列】&#x1f380;&#x1f380;&#x1f380; Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…

超详细!一文搞定PID!嵌入式STM32-PID位置环和速度环

本文目录 一、知识点1. PID是什么&#xff1f;2. 积分限幅--用于限制无限累加的积分项3. 输出值限幅--用于任何pid的输出4. PID工程 二、各类PID1. 位置式PID&#xff08;用于位置环&#xff09;&#xff08;1&#xff09;公式&#xff08;2&#xff09;代码使用代码 2. 增量式…

直观解读 JuiceFS 的数据和元数据设计(一)

大家读完觉得有意义和帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 JuiceFS 高层架构与组件2 搭建极简 JuiceFS 集群 2.1 搭建元数据集群2.2 搭建对象存储&#xff08;MinIO&#xff09; 2.2.1 启动 MinIO server2.2.2 创建 bucket2.3 下载 juicefs 客户端2.4 创…

数据结构漫游记:静态双向链表

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…

【Web安全】文件写入漏洞 ASP 网页病毒模拟(文件写入漏洞+FilesystemObject)

【Web安全】文件写入漏洞 ASP 网页病毒模拟&#xff08;文件写入漏洞FilesystemObject&#xff09; 原理 文件写入漏洞 文件写入漏洞是指攻击者通过某种方式在服务器上创建或修改文件的漏洞。攻击者可以利用此漏洞在服务器上写入恶意代码或文件&#xff0c;从而实现进一步的…

【Unity3d】C#浮点数丢失精度问题

一、float、double浮点数丢失精度问题 Unity3D研究院之被坑了的浮点数的精度&#xff08;一百零三&#xff09; | 雨松MOMO程序研究院 https://segmentfault.com/a/1190000041768195?sortnewest 浮点数丢失精度问题是由于大部分浮点数在IEEE754规范下就是无法准确以二进制…

Browser Use:AI智能体自动化操作浏览器的开源工具

Browser Use:AI智能体自动化操作浏览器的开源工具 Browser Use 简介1. 安装所需依赖2. 生成openai密钥3. 编写代码4. 运行代码5. 部署与优化5.1 部署AI代理5.2 优化与扩展总结Browser Use 简介 browser-use是一个Python库,它能够帮助我们将AI代理与浏览器自动化操作结合起来;…

tcpdump指南(1)

大家读完觉得有意义记得关注和点赞&#xff01;&#xff01;&#xff01; tcpdump是一种在网络上转储流量的网络工具。 这篇文章服务器作为一些常用命令的指南。如需完整指南&#xff0c; 请参阅手册页&#xff0c;或在 Linux 计算机上。man tcpdump 1 基本选项 帮助摘要&#…

14. 日常算法

1. 面试题 02.04. 分割链表 题目来源 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 class Solution { public:ListNo…