MarsCode青训营序章Day1|稀土掘金-1.找单独的数、47.完美偶数计数、3.数组字符格式化

稀土掘金-1.找单独的数(1.找单独的数)

题目分析:

n个同学每人持有1张写有数字的卡片,除了一个数字之外,其他每个数字均出现了刚好2次,要求设计时间复杂度为O(n)的算法从cards数组中查找该单独的数。

题目重点:

已知除单独的数外,其余的都是成对的数,则不存在重复次数超过2的数。需要使时间复杂度为O(n),考虑借助双指针法进行复杂度降阶。又因为使用双指针法需要数组有序,所以先对数组排序。

解题思路:

将数组按升序排序,用cur指针指向数组的首个元素,对比cur和cur+1的数是否相等,若相等则cur+=2,否则返回该数。需要检查边界条件,防止cur+1或cur+=2越界,只需使cur=cards.length-1时退出循环即可。

思路优化:

重新读题,发现数组排序步骤的.sort()方法的时间复杂度为O(nlongn),超过了题目的时间复杂度要求。检查约束条件,发现测试样例的数组长度区间和数组元素取值区间均已给出,考虑借助约束条件设计新的排序算法如下:

基数排序:

基数排序(Radix Sort)是一种非比较型整数排序算法,适用于整数排序,特别是当整数的位数较少时。基数排序的时间复杂度为O(d * (n + k)),其中d是数字的最大位数,n是数组的长度,k是每个位可能的取值范围(例如0-9)。

import java.util.Arrays;public class Main {public static void radixSort(int[] arr) {if (arr == null || arr.length == 0) {return;}// 找出数组中的最大值int max = Arrays.stream(arr).max().getAsInt();// 从最低位开始,对每一位进行计数排序for (int exp = 1; max / exp > 0; exp *= 10) {countingSortByDigit(arr, exp);}}private static void countingSortByDigit(int[] arr, int exp) {int n = arr.length;int[] output = new int[n];int[] count = new int[10];// 统计每个数字出现的次数for (int i = 0; i < n; i++) {count[(arr[i] / exp) % 10]++;}// 计算每个数字的累计次数for (int i = 1; i < 10; i++) {count[i] += count[i - 1];}// 构建输出数组for (int i = n - 1; i >= 0; i--) {output[count[(arr[i] / exp) % 10] - 1] = arr[i];count[(arr[i] / exp) % 10]--;}// 将输出数组复制回原数组System.arraycopy(output, 0, arr, 0, n);}public static void main(String[] args) {int[] cards = {170, 45, 75, 90, 802, 24, 2, 66};radixSort(cards);System.out.println(Arrays.toString(cards));}
}

总结反思

基数排序虽然借助题目给出的约束条件实现了时间复杂度近似为O(n)的排序,但却也开拓了许多额外空间。

重新分析题目:时间复杂度要求为O(n),说明不能使用排序,而是要从数本身的特性出发——每个数字要么成对,要么单独。我们需要一个漏斗,将唯一一个不是成对的数字筛出来,就像对对碰一样,让成对的数相消即可,这就让我们想到了异或的特性。

用一个result,将其初始化为0,遍历数组与每一个元素取异或。最终,每个相同的数取异或相消为0,每个新的数与0取异或得到自身,最终剩下来的result就是单独的数

public class Main {public static int solution(int[] cards) {// Edit your code hereint result = 0;for (int card : cards) {result ^= card;  // 使用异或操作}return result;}public static void main(String[] args) {// Add your test cases hereSystem.out.println(solution(new int[]{1, 1, 2, 2, 3, 3, 4, 5, 5}) == 4);System.out.println(solution(new int[]{0, 1, 0, 1, 2}) == 2);}
}

稀土掘金-47.完美偶数计数(47.完美偶数计数)

题目分析:

完美偶数是一个在指定区间内的偶数,现欲求在长度为n的数组a中有多少个满足值区间为[l,r]的完美偶数。

题目重点:

直接遍历计数即可。

解题思路:

遍历数组中的每个元素,分别设置不为偶数、小于下界、大于上界的三个判断条件跳过该循环,否则result++

public class Main {public static int solution(int n, int l, int r, int[] a) {// write code hereint result = 0;for (int i : a) {if (i % 2 != 0)continue;if (i < l)continue;if (i > r)continue;result++;}return result;}public static void main(String[] args) {System.out.println(solution(5, 3, 8, new int[] { 1, 2, 6, 8, 7 }) == 2);System.out.println(solution(4, 10, 20, new int[] { 12, 15, 18, 9 }) == 2);System.out.println(solution(3, 1, 10, new int[] { 2, 4, 6 }) == 3);}
}

稀土掘金-3.数组字符格式化(3.数组字符格式化)

题目分析:

将不带千分位逗号的数字字符串转换为带千分位逗号的格式,并保留小数部分。还需精简掉字符串前无用的0。

题目重点:

先精简无用0,再插入千分位逗号。

解题思路:

初始化一个StringBuilder sb。

用s.charAt(i)从左到右遍历字符串直至找到第一个不是无用0的字符将其append入sb,并记录其下标为left。

接着遍历剩余字符并将其append入sb,直至找到小数点或遍历字符串完全,将其append入sb,并记录其下标减一为right。

若仍有剩余字符,继续将其append入sb。

利用left和right,可以计算出有效整数位数千分位逗号个数,将其从低到高找出最高的千分位逗号插入处,使用insert方法将其插入字符串,并从左到右每隔4个字符(包括新插入的逗号)将剩余逗号插入。

最终用toString()将该字符串导出。

  • 注意left和right作为有效整数部分区间的开闭
  • 注意处理插入指针为0的特殊情况
  • 注意插入指针的跨步数应为4(包括新插入的',')
public class Main {public static String solution(String s) {StringBuilder sb = new StringBuilder();if (s.length() == 0)return "";int cur = 0;int left = 0; // 整数部分的最高位int right = 0;// 整数部分的最低位int l = 0;    // 整数部分的长度int num = 0;  // 千分位逗号的个数while (cur < s.length() && s.charAt(cur) == '0'){ //精简无用'0'cur++;}left = cur; // 整数部分的最高位//System.out.println(left);while(cur < s.length()){sb.append(s.charAt(cur));if(s.charAt(cur) == '.')right = cur-1; // 整数部分的最低位cur++;}if(right == 0)right = s.length()-1; // 整数部分的最低位//System.out.println(right);l = right-left+1; // 整数部分的长度//System.out.println(l);num = l/3; // 千分位逗号的个数//System.out.println(num);cur = l%3; // 最高的千分位逗号下标//System.out.println(cur);if(cur == 0){cur+=3;num--;}while(num > 0){sb.insert(cur, ',');cur+=4;num--;}return sb.toString();}public static void main(String[] args) {System.out.println(solution("1294512.12412").equals("1,294,512.12412"));System.out.println(solution("0000123456789.99").equals("123,456,789.99"));System.out.println(solution("987654321").equals("987,654,321"));}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nfc中继测试

简述&#xff1a; 像NFC钥匙的中继是比较简单的&#xff0c;我们需要准备的工具是两台手机&#xff0c;然后需要一个服务端。在手机上安装工具NFC gate&#xff0c;通过这个工具就可以针对NFC进行中继。只要一个手机靠近NFC卡片钥匙&#xff0c;另外一个手机贴住车门就可以实现…

STM32--MAP文件

C语言源代码到目标文件的分析过程&#xff1a; 预处理操作&#xff1a;执行宏替换、条件编译以及包含指定的文件 hello.i&#xff1a;预处理后文件 编译&#xff1a;进行机器翻译产出 hello.s&#xff1a;汇编文件 hello.o&#xff1a;可重定位目标文件&#xff08;机器码文件&…

UPLOAD LABS | UPLOAD LABS 靶场初识

关注这个靶场的其它相关笔记&#xff1a;UPLOAD LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;UPLOAD LABS 靶场简介 UPLOAD LABS 靶场是一个专门用于学习文件上传漏洞攻击和防御的靶场。它提供了一系列文件上传漏洞的实验环境&#xff0c;用于帮助用户了解文件上传漏洞的…

基于米尔全志T527开发板的FacenetPytorch人脸识别方案

本篇测评由优秀测评者“小火苗”提供。 本文将介绍基于米尔电子MYD-LT527开发板&#xff08;米尔基于全志 T527开发板&#xff09;的FacenetPytorch人脸识别方案测试。 一、facenet_pytorch算法实现人脸识别 深度神经网络 1.简介 Facenet-PyTorch 是一个基于 PyTorch 框架实…

基于智能物联网关的车辆超重AI检测应用

超重超载是严重的交通违法行为&#xff0c;超重超载车辆的交通安全风险极高&#xff0c;像是一颗行走的“不定时炸弹”&#xff0c;威胁着社会公众的安全。但总有一些人受到利益驱使&#xff0c;使超重超载的违法违规行为时有发生。 随着物联网和AI技术的发展&#xff0c;针对预…

scala的守卫语句格式

import scala.io.StdIn object test49{//从控制台读入一个数字a,使用&#xff08;StdIn.readInt&#xff09;//如果a>0并且a<3,打印[0-3]//如果a>4并且a<8,打印[4-8]//否则:打印未匹配 // def main(args: Array[String]): Unit { // val aStdIn.readInt()//等…

数组和链表OJ题

leetcode用编译器调试的技巧 数组和链表练习题 leetcode/reverse_Link/main.c Hera_Yc/bit_C_学习 - 码云 - 开源中国 1、移除元素 ​​​​​​27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; int removeElement(int* nums, int numsSize, int val) {int src 0, …

Scala—数组(不可变数组Array、可变数组ArrayBuffer)用法详解

Scala集合概述-链接 大家可以点击上方链接&#xff0c;先对Scala的集合有一个整体的概念&#x1f923;&#x1f923;&#x1f923; 在 Scala 中&#xff0c;数组是一种特殊的集合类型&#xff0c;可以是可变的也可以是不可变的。 1. 不可变数组 在 Scala 中&#xff0c;不可变…

Kylin Server V10 下 Nacos 集群部署

集群部署架构图 端口 与主端口的偏移量 描述 8848 0 主端口,客户端、控制台及

摄像头原始数据读取——V4L2(userptr模式,V4L2_MEMORY_USERPTR)

摄像头原始数据读取——V4L2(userptr模式,V4L2_MEMORY_USERPTR) 用户指针方式允许用户空间的应用程序分配内存&#xff0c;并将内存地址传递给内核中的驱动程序。驱动程序直接将数据填充到用户空间的内存中&#xff0c;从而避免了数据的拷贝过程。 流程&#xff1a; 通过VIDI…

亚马逊开发视频人工智能模型,The Information 报道

根据《The Information》周三的报道&#xff0c;电子商务巨头亚马逊&#xff08;AMZN&#xff09;已开发出一种新的生成式人工智能&#xff08;AI&#xff09;&#xff0c;不仅能处理文本&#xff0c;还能处理图片和视频&#xff0c;从而减少对人工智能初创公司Anthropic的依赖…

一次完整的CNAS软件测试实验室内部审核流程

内部审核是软件测试实验室管理体系重的重要部分&#xff0c;通过内部审核可以为有效的管理评审和纠正、预防措施提供信息&#xff0c;以验证组织的管理体系是否持续的满足规定的要求并且正在运行。 内部审核需要依据文件化的程序&#xff0c;每年至少实施一次&#xff0c;软件…

Matlab数字信号处理——音频信号处理与分析GUI

1.实现内容 实现功能有回响、变声、倒放、变速、音量调整、加噪、设计 FIR和 IR 滤波器实现去噪功能(高通低通带通带阻)&#xff0c;并且在时域波形图和频域波形展示变化。滤波器包括各种参数的选择、滤波器结构和类型的选择等。同时GUI上还包含打开、播放、保存、退出功能。 …

pcb线宽与电流

三十年一路高歌猛进的中国经济&#xff0c; 中国经历了几个三十年&#xff1f; 第一个三十年&#xff1a;以计划为导向。 第二个三十年&#xff1a;以经济为导向。 现在&#xff0c;第三个三十年呢&#xff1f; 应该是以可持续发展为导向。 传统企业摇摇欲坠&#xff0c; 新兴企…

redis命令 及 redis 常见的数据结构

文章目录 一. 核心命令1. set2. get 二. 全局命令1. keys2. exists3. del4. expire5. ttl6. type 三. redis 常见的数据结构 一. 核心命令 1. set set key value key 和 value 都是string类型的 对于key value, 不需要加上引号, 就是表示字符串类型, 加上也可以 redis中, 不…

跨平台应用开发框架(4)----Qt(系统篇)

目录 1.Qt事件 1.事件来源 2.事件处理 3.按键事件 1.组合按键 4.鼠标事件 1.鼠标单击事件 2.鼠标释放事件 3.鼠标双击事件 4.鼠标移动事件 5.滚轮事件 5.定时器 1.QTimerEvent类 2.QTimer 类 3.获取系统日期及时间 6.事件分发器 7.事件过滤器 2.Qt文件 1.输入…

uniapp在App端定义全局弹窗,当打开关闭弹窗会触发onShow、onHide生命周期怎么解决?

在uniapp(App端)中实现自定义弹框&#xff0c;可以通过创建一个透明页面来实现。点击进入当前页面时&#xff0c;页面背景会变透明&#xff0c;用户可以根据自己的需求进行自定义&#xff0c;最终效果类似于弹框。 遇到问题&#xff1a;当打开弹窗(进入弹窗页面)就会触发当前页…

DM达梦管理工具拖出空白区块,无法关闭

1. 出现问题&#xff1a;DM达梦管理工具拖出空白区块&#xff0c;无法关闭。 2. 解决方法 新建查询页&#xff0c;把查询页拖到空白区块里&#xff0c;完全覆盖空白区块。之后空白区块会变成查询页&#xff0c;右上角会出现叉号&#xff0c;点击叉号关闭就行。 3. 后记 达梦…

DevExpress的web Dashboard应用

本文旨在从零开始创建一个包含dashboard的应用 一、前期准备 1、语言&#xff1a;C# 2、软件&#xff1a;Visual Studio 2019 3、框架&#xff1a;DevExpress19.2(付费)、ASP.NET(Web) 4、组件&#xff1a;dashboard 二、创建ASP.NET Web窗体仪表板应用程序 1、创建一个空的w…

【vue-router】Vue-router如何实现路由懒加载

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…