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. centos下安装不同版本的python

    1. 安装环境以及依赖包 可以直接yum安装: yum -y install git gcc make patch zlib-devel gdbm-devel openssl-devel sqlite ...

  2. IP与bigint互转

    IP转为bigint create function [dbo].[iptobigint](@ipinfo varchar(16)) returns bigint as begin declare @ ...

  3. 删除Mac版word上方的Mathtype

    原因 Mac升级到macOS Catalina v10.15.3发现mathtype用不了, Mathtype官网说目前暂时不支持这个版本的系统. 现在尴尬的是, mathtype删除了, 但一不小心 ...

  4. Maven学习笔记2:Maven核心概念

    一.Maven工程约定目录结构 (说是约定,既是说它是大多数人都遵守的规范,但不是强制的) 一个小例子,熟悉Maven目录结构 这是官网给的例子,可以复制它的pom.xml来修改 第一步:建立项目 按 ...

  5. Any to Any 实时变声的实现与落地丨RTC Dev Meetup

    前言 「语音处理」是实时互动领域中非常重要的一个场景,在「RTC Dev Meetup丨语音处理在实时互动领域的技术实践和应用」活动中,来自声网.微软和数美的技术专家,围绕该话题进行了相关分享. 本文 ...

  6. Mybatisplus----DML编程---多记录操作

    批量处理数据: @Test void testDelete(){ //批量按id删除 List<Long> list = new ArrayList<>(); list.add ...

  7. 「java技术干货」switch分支结构详解

    前言 在上一篇文章中,壹哥给大家介绍了Java里的顺序.分支.循环结构的概念,并且重点给大家讲解了分支结构中的条件分支.并在条件分支中,详细地给大家讲解了if条件分支的使用.现在我们应该知道,if条件 ...

  8. Java 面试——Zookeeper

    一.Zookeeper 实现机制 文件系统 + 通知机制 二.Zookeeper 高可用实现原理 一个 ZooKeeper 集群如果要对外提供可用的服务,那么集群中必须要有过半的机器正常工作并且彼此之 ...

  9. 自己动手从零写桌面操作系统GrapeOS系列教程——24.加载并运行loader

    学习操作系统原理最好的方法是自己写一个简单的操作系统. 之前我们在电脑的启动过程中介绍过boot程序的主要任务就是加载并运行loader程序,本讲我们就来实现. 本讲代码文件共2个: boot.asm ...

  10. flutter---->阿里云oss的插件

    目前为止,阿里云官方并没有dart版本的oss sdk,所以才开发了这个插件flutter_oss_aliyun提供对oss sdk的支持. flutter_oss_aliyun 一个访问阿里云oss ...