2022-07-17:1、2、3...n-1、n、n、n+1、n+2... 在这个序列中,只有一个数字有重复(n)。 这个序列是无序的,找到重复数字n。 这个序列是有序的,找到重复数字n。
2022-07-17:1、2、3…n-1、n、n、n+1、n+2…
在这个序列中,只有一个数字有重复(n)。
这个序列是无序的,找到重复数字n。
这个序列是有序的,找到重复数字n。
答案2022-07-17:
不能用哈希表。
第一问,两种方法,快慢指针找环问题和异或法。
第二问,二分法。
代码用rust编写。代码如下:
use rand::Rng;
use std::collections::HashSet;
fn main() {
let nn: i32 = 10;
let test_time: i32 = 3000;
println!("测试开始");
for _ in 0..test_time {
let mut arr = random_array(rand::thread_rng().gen_range(0, nn) + 1);
let mut arr2 = arr.clone();
if right(&mut arr) != find_duplicate(&mut arr) {
println!("未排序情况出错!快慢指针方式");
break;
}
if right(&mut arr2) != find_duplicate2(&mut arr2) {
println!("未排序情况出错!异或方式");
break;
}
arr.sort();
if right(&mut arr) != find_duplicate_sorted(&mut arr) {
println!("排序情况出错!二分法");
break;
}
}
println!("测试结束");
}
// 为了测试
// 绝对正确,但是直接遍历+哈希表,没有得分的方法
fn right(arr: &mut Vec<i32>) -> i32 {
let mut set: HashSet<i32> = HashSet::new();
for num in arr.iter() {
if set.contains(num) {
return *num;
}
set.insert(*num);
}
return -1;
}
// 符合题目要求的、无序数组,找重复数
// 时间复杂度O(N),额外空间复杂度O(1)
// 用快慢指针
fn find_duplicate(arr: &mut Vec<i32>) -> i32 {
if arr.len() < 2 {
return -1;
}
let mut slow = arr[0];
let mut fast = arr[arr[0] as usize];
while slow != fast {
slow = arr[slow as usize];
fast = arr[arr[fast as usize] as usize];
}
// slow == fast
fast = 0;
while slow != fast {
fast = arr[fast as usize];
slow = arr[slow as usize];
}
// 再相遇!一个结论
return slow;
}
// 符合题目要求的、无序数组,找重复数
// 时间复杂度O(N),额外空间复杂度O(1)
// 用异或
fn find_duplicate2(arr: &mut Vec<i32>) -> i32 {
if arr.len() < 2 {
return -1;
}
let mut ans = 0;
for i in 0..arr.len() as i32 {
ans ^= i;
}
for i in 0..arr.len() as i32 {
ans ^= arr[i as usize];
}
// 再相遇!一个结论
return ans;
}
// 符合题目要求的、有序数组,找重复数
// 时间复杂度O(logN),额外空间复杂度O(1)
fn find_duplicate_sorted(arr: &mut Vec<i32>) -> i32 {
if arr.len() < 2 {
return -1;
}
let mut l: i32 = 0;
let mut r: i32 = arr.len() as i32 - 1;
let mut m: i32;
let mut ans = -1;
while l <= r {
m = (l + r) / 2;
if (m - 1 >= 0 && arr[(m - 1) as usize] == arr[m as usize])
|| (m + 1 < arr.len() as i32 && arr[(m + 1) as usize] == arr[m as usize])
{
ans = arr[m as usize];
break;
}
if m - l == arr[m as usize] - arr[l as usize] {
l = m + 1;
} else {
r = m - 1;
}
}
return ans;
}
// 为了测试
fn random_array(n: i32) -> Vec<i32> {
let mut ans: Vec<i32> = vec![];
for i in 0..n + 1 {
ans.push(i + 1);
}
ans[n as usize] = rand::thread_rng().gen_range(0, n) + 1;
let mut i = n;
while i > 0 {
let j = rand::thread_rng().gen_range(0, i + 1);
let tmp = ans[i as usize];
ans[i as usize] = ans[j as usize];
ans[j as usize] = tmp;
i -= 1;
}
return ans;
}
执行结果如下:

2022-07-17:1、2、3...n-1、n、n、n+1、n+2... 在这个序列中,只有一个数字有重复(n)。 这个序列是无序的,找到重复数字n。 这个序列是有序的,找到重复数字n。的更多相关文章
- LeetCode 33. Search in Rotated Sorted Array(在旋转有序序列中搜索)
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...
- Python实现在给定整数序列中找到和为100的所有数字组合
摘要: 使用Python在给定整数序列中找到和为100的所有数字组合.可以学习贪婪算法及递归技巧. 难度: 初级 问题 给定一个整数序列,要求将这些整数的和尽可能拼成 100. 比如 [17, 1 ...
- 【python cookbook】【数据结构与算法】10.从序列中移除重复项且保持元素间顺序不变
问题:从序列中移除重复的元素,但仍然保持剩下的元素顺序不变 解决方案: 1.如果序列中的值时可哈希(hashable)的,可以通过使用集合和生成器解决.
- jjava Date格式是 May 07 17:44:06 CST 2018,怎么插入数据库中的timestamp格式中
首先 我来记录下错误 死在时间格式转换错误手里了 大致就是时间格式转化失败 java代码中的May 07 17:44:06 CST 2018 是这个格式转换为 数据库的 yyyy-MM-dd HH: ...
- 在一个含有1-n的序列中,每次找到第Ki小的数,并把它删除(线段树)
提交链接 Data structure is one of the basic skills for Computer Science students, which is a particular ...
- C语言:假定输入的字符串只包含字母和*号,fun函数:除了尾部的*号以外,将字符的其他*号进行全部删除,形参p已经指向字符串中最后一个字母。-利用折半查找整数m在有序数组中的位置,若找到,返回下标值,否则返回-1。
//假定输入的字符串只包含字母和*号,fun函数:除了尾部的*号以外,将字符的其他*号进行全部删除,形参p已经指向字符串中最后一个字母. #include <stdio.h> void f ...
- 2021.07.17 题解 CF1385E Directing Edges(拓扑排序)
2021.07.17 题解 CF1385E Directing Edges(拓扑排序) CF1385E Directing Edges - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) ...
- 2021.07.17 P4170 染色(区间DP)
2021.07.17 P4170 染色(区间DP) [P4170 CQOI2007]涂色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.目标状态可以由哪些状态转移过来. ...
- 2021.07.17 P3177 树上染色(树形DP)
2021.07.17 P3177 树上染色(树形DP) [P3177 HAOI2015]树上染色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.dp思想是需要什么,维护 ...
- Deep-Learning-with-Python] 文本序列中的深度学习
https://blog.csdn.net/LSG_Down/article/details/81327072 将文本数据处理成有用的数据表示 循环神经网络 使用1D卷积处理序列数据 深度学习模型可以 ...
随机推荐
- vs2019远程调试win7系统的程序
vs2019远程调试 一.安装vs2019远程调试工具 首先让调试的电脑(也就是不安装vs2019的电脑),安装vs2019远程调试工具:VS_RemoteTools.exe. 网址:进行下载.h ...
- element ui upload 组件多文件上传,最终只显示上传一个的问题
问题描述:一次选多张图片上传的时候界面上只有一张图片显示,并且上传调用的接口次数与选择的图片数量一致,且接口已200. JSON格式,"url"是最终显示的图片地址 { & ...
- 【picoCTF]cookies write up
顾名思义,这一挑战涉及对cookie的简单操作.登录页面会显示一个搜索框,其中包含一个输入字段,用于检查您为其提供的 Cookie 类型. 点击链接,页面如下: 随便在框里输入内容,显示如下: 输出返 ...
- CSS函数var
/*全局变量保存的地方*/ :root { --main-bg-color: red; /* 变量名必须以--开头 */ } var(custom-property-name, value) 值 描述 ...
- Linux 命令之 tar 操作符
tar -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个 ...
- 每次SSH执行完都会关闭通道,返回目录,如果想一次执行多步操作,需要多条命令才能达到目的时,用;分割操作指令,一并导入执行
每次SSH执行完都会关闭通道,返回目录,如果想一次执行多步操作,需要多条命令才能达到目的时,用:分割操作指令,一并导入执行: 例如: self.execmd='cd ../tmp/log/;pwd;t ...
- Scanner基础用法
Scanner基础用法 引入包java.util.Scanner 读一个单词 package charpter2; import java.util.Scanner; public class Sca ...
- Java面试——Java基础
更多内容,移步IT-BLOG 一.JAVA中的几种基本数据类型 Java语言中一共提供了8种原始的数据类型(byte,short,int,long,float,double,char,boolean) ...
- Stanford CS 144, Lab 0: networking warmup 实验
Stanford CS 144, Lab 0: networking warmup Finish Stanford CS144 lab0 and pass the test. 2023/03/29 - ...
- Nmap基本使用【速查版】
列举远程机器开放的端口 nmap [域名] 列举远程机器开放的端口和服务 nmap --dns-servers 8.8.8.8 [域名] nmap进行探测之前要把域名通过DNS服务器解析为IP地址,我 ...