2、寻找重复数字
时间:2021-04-17
本文章向大家介绍2、寻找重复数字,主要包括2、寻找重复数字使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
寻找重复数字
大致有两种不同版本:
1
给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。
假设 nums 只有 一个重复的整数 ,找出 这个重复的数 。
2
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
限制:
2 <= n <= 100000
总结
对于1 与 2 通用解法为
1、采用hashSet排重 时间复杂度On 空间复杂度On
2、采用排序算法 时间复杂度Onlogn 空间复杂度O1
对于版本1 由于特殊的数字设定 此处有两种解决方法:
//将数字想象成一个个链表节点:将问题转换为:寻找有环列表的起始节点
public int findDuplicate(int[] nums) {
//[0],[1,2,3,1],[1,1,1,1],[]
int slow = nums[0];
int fast = nums[nums[0]];
while (slow != fast){
slow = nums[slow];
fast = nums[nums[fast]];
}
int find = 0;
while (find != slow){
find = nums[find];
slow = nums[slow];
}
return find;
}
//halfrost巧解 只适用于1 - n的情况
public int findDuplicate(int[] nums) {
for (int i = 0; i < nums.length;i++){
int var = Math.abs(nums[i]);
if (nums[var - 1] < 0 ) return var;
nums[var - 1] *= -1;
}
return -1;
}
对于版本2 此处可使用版本1-1 变体 将数字同同步+1 转换 也可使用如下需要修改数组的方法
public int findRepeatNumber(int[] nums) {
//[0],[0,1,2,0],[1,1,1,1],[]
for (int i = 0; i < nums.length;){
if (nums[i] == i){
i++;
continue;
}
else if (nums[i] == nums[nums[i]]){
return nums[i];
}else{
exchange(nums, i, nums[i]);
}
}
return -1;
}
public void exchange(int[] nums, int posa, int posb){
int temp = nums[posa];
nums[posa] = nums[posb];
nums[posb] = temp;
}
总结
1、首先确定要求 遵循如下几个原则
1、能否对入参进行修改?
2、有无时间、空间复杂度要求?
3、需要考虑的特殊情况, 边界条件有哪些?
2、完成1后 先编写测试用例 尽量能覆盖以上几种情况
编写完成代码后需要对已编写的测试用例逐一进行口算测试
原文地址:https://www.cnblogs.com/linyxBlog/p/14670946.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R语言使用 LOWESS技术图分析逻辑回归中的函数形式
- R语言在逻辑回归中求R square R方
- R语言Poisson回归的拟合优度检验
- R语言ROC曲线下的面积-评估逻辑回归中的歧视
- 东芝MCU实现位带操作
- 单向链表的一点儿感悟
- rt-thread的内存管理分析
- R平方/相关性取决于预测变量的方差
- stata具有异方差误差的区间回归
- R语言用于线性回归的稳健方差估计
- 用SAS进行泊松,零膨胀泊松和有限混合Poisson模型分析
- 东芝开发板驱动OLED模块显示LOGO图片
- sas文本挖掘案例:如何使用SAS计算Word Mover的距离
- R语言ggplot2 对Facebook用户数据可视化分析
- 如何实现一个圆弧倒计时进度条