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;
}

执行结果如下:


左神java代码

2022-07-17:1、2、3...n-1、n、n、n+1、n+2... 在这个序列中,只有一个数字有重复(n)。 这个序列是无序的,找到重复数字n。 这个序列是有序的,找到重复数字n。的更多相关文章

  1. 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. ...

  2. Python实现在给定整数序列中找到和为100的所有数字组合

    摘要:  使用Python在给定整数序列中找到和为100的所有数字组合.可以学习贪婪算法及递归技巧. 难度:  初级 问题 给定一个整数序列,要求将这些整数的和尽可能拼成 100. 比如 [17, 1 ...

  3. 【python cookbook】【数据结构与算法】10.从序列中移除重复项且保持元素间顺序不变

    问题:从序列中移除重复的元素,但仍然保持剩下的元素顺序不变 解决方案: 1.如果序列中的值时可哈希(hashable)的,可以通过使用集合和生成器解决.

  4. jjava Date格式是 May 07 17:44:06 CST 2018,怎么插入数据库中的timestamp格式中

    首先 我来记录下错误 死在时间格式转换错误手里了 大致就是时间格式转化失败 java代码中的May 07 17:44:06 CST 2018  是这个格式转换为 数据库的 yyyy-MM-dd HH: ...

  5. 在一个含有1-n的序列中,每次找到第Ki小的数,并把它删除(线段树)

    提交链接 Data structure is one of the basic skills for Computer Science students, which is a particular ...

  6. C语言:假定输入的字符串只包含字母和*号,fun函数:除了尾部的*号以外,将字符的其他*号进行全部删除,形参p已经指向字符串中最后一个字母。-利用折半查找整数m在有序数组中的位置,若找到,返回下标值,否则返回-1。

    //假定输入的字符串只包含字母和*号,fun函数:除了尾部的*号以外,将字符的其他*号进行全部删除,形参p已经指向字符串中最后一个字母. #include <stdio.h> void f ...

  7. 2021.07.17 题解 CF1385E Directing Edges(拓扑排序)

    2021.07.17 题解 CF1385E Directing Edges(拓扑排序) CF1385E Directing Edges - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) ...

  8. 2021.07.17 P4170 染色(区间DP)

    2021.07.17 P4170 染色(区间DP) [P4170 CQOI2007]涂色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.目标状态可以由哪些状态转移过来. ...

  9. 2021.07.17 P3177 树上染色(树形DP)

    2021.07.17 P3177 树上染色(树形DP) [P3177 HAOI2015]树上染色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.dp思想是需要什么,维护 ...

  10. Deep-Learning-with-Python] 文本序列中的深度学习

    https://blog.csdn.net/LSG_Down/article/details/81327072 将文本数据处理成有用的数据表示 循环神经网络 使用1D卷积处理序列数据 深度学习模型可以 ...

随机推荐

  1. Markdown操作方法

    Markdown学习 标题 三级标题 四级标题 字体 原本 hello,world! 斜体 hello,world! 加粗 hello,world! 斜体加粗 hello,world! 删除 hell ...

  2. mybaits-plus 部分注解说明

    参考: https://blog.csdn.net/qq_45684867/article/details/123951309

  3. Promise的使用及原理

    此文章主要讲解核心思想和基本用法,想要了解更多细节全面的使用方式,请阅读官方API 这篇文章假定你具备最基本的异步编程知识,例如知道什么是回调,知道什么是链式调用,同时具备最基本的单词量,例如page ...

  4. Solon v2.2.6 发布,助力信创国产化

    Solon 是一个高效的 Java 应用开发框架:更快.更小.更简单.它是一个有自己接口标准规范的开放生态,可为应用软件国产化提供支持,助力信创建设. 150来个生态插件,覆盖各种不同的应用开发场景: ...

  5. 使用GithubAction自动构建部署项目

    目录 1.1 项目准备 2.1 GithubAction设置 3.1 运行测试 4.1 小结 GitHub Actions 是一种持续集成和持续交付(CI/CD) 平台,可用于自动执行生成.测试和部署 ...

  6. CommunityToolkit.Mvvm8.1 viewmodel源生成器写法(3)

    本系列文章导航 https://www.cnblogs.com/aierong/p/17300066.html https://github.com/aierong/WpfDemo (自我Demo地址 ...

  7. day60:Linux压缩与打包&用户管理&用户提权sudo&grep,sed,awk,sort,uniq

    目录 1.文件管理-压缩与打包 2.用户管理 用户怎么查 如何创建用户 创建的用户信息都存储在哪? 用户存储密码的文件 如何为用户设定密码? 3.用户组 4.用户提权相关 5.Extra:额外补充 文 ...

  8. group_concat_max_len设置过小致group_concat()排列不全

    问题描述:group_concat_max_len默认值1024导致group_concat函数排列显示不足 group_concat_max_len长度显示跟group_concat排列长度息息相关 ...

  9. py文件转换为so文件

    将py文件编译为so文件 利用上面代码生成so文件生成的文件不方便取放,名字也不一样 通过执行发现转换执行了下面三句 /usr/local/python3/bin/cython test.py gcc ...

  10. MySQL(四)用户与权限管理

    用户与权限管理 用户管理 MySQL用户分为普通用户和root用户,提供了许多语句来管理包括登录.退出MySQL服务器.创建用户.删除用户.密码管理和权限管理等内容. 登录MySQL服务器 mysql ...