AcWing14:找出数组中重复的数字
Posted 劭兮劭兮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing14:找出数组中重复的数字相关的知识,希望对你有一定的参考价值。
问题
原题链接
原题链接:找出数组中重复的数字
个人思路
自己思路:
双层for循环,把整个数组遍历一遍,每一个元素都与其后面的元素比较,如果有相等的元素,结束循环;
java实现
class Solution {
public static void main(String[] args) {
int[] nums = {2,3,5,4,3,2,6,7};
duplicateInArray(nums);
}
public static int duplicateInArray(int[] nums) {
int n = nums.length;
for(int i = 0;i<n;i++) {
if(nums[i]<0 || nums[i]>n-1) {
return -1;
}
}
for(int i = 0;i<n-1;i++) {
for(int j = i+1;j<n;j++) {
if(nums[i] == nums[j]) {
return nums[i];
}
}
}
return -1;
}
}
C++实现
class Solution {
public:
int duplicateInArray(vector<int>& nums) {
int n = nums.size();
for(auto x : nums){
if(x<0 || x>n-1){
return -1;
}
}
for(int i = 0;i<n-1;i++){
for(int j = i+1;j<n;j++){
if(nums[i] == nums[j]){
return nums[i];
}
}
}
return -1;
}
};
大佬思路
(自己的解题思路比较菜,所以一般会学习一下大佬的思路)
循环遍历整个数组,
因为所有数字都在0——n-1的范围内,
数组下标范围也是0——n-1,
所意我们试图把所有数字都放在与其数组下标相对应的位置上,
使 nums[i] = i;(左边的i指的是数组下标,右边的i指的是数组nums的一个元素)
每一次交换,都能使一个元素放在正确的位置上,
跳出while循环的条件是:nums[i] = x;
nums[x] = x;
此时,nums[x] = x,并且nums[i] = x;
所以,很明显 x 重复了,则返回nums[i],即返回x;
java实现
package com.yangping.acwing;
public class Second {
public static void main(String[] args) {
int[] nums = {2,3,5,4,3,2,6,7};
int n = duplicateInArray(nums);
System.out.println(n);
}
public static int duplicateInArray(int[] nums) {
int n = nums.length;
for(int i = 0;i<n;i++) {
if(nums[i]<0 || nums[i]>n-1) {
// System.out.println(-1);
return -1;
}
}
int temp = 0;
for(int i = 0;i<n;i++) {
while (nums[nums[i]] != nums[i]) {
temp = nums[nums[i]];
nums[nums[i]] = nums[i];
nums[i] = temp;
// 输出交换后的数组
// for(int num : nums) {
// System.out.print(num);
// }
// System.out.println("交换成功!");
}
if (nums[i] != i && nums[nums[i]] == nums[i]) {
return nums[i];
}
}
return -1;
}
}
C++实现
class Solution {
public:
int duplicateInArray(vector<int>& nums) {
int n = nums.size();
for(auto x : nums){
if(x<0 || x>n-1){
return -1;
}
}
for(int i = 0;i<n;i++){
while(nums[nums[i]] != nums[i]){
swap(nums[nums[i]],nums[i]);
}
if(nums[i] != i){
return nums[i];
}
}
return -1;
}
};
C实现
int duplicateInArray(int *nums, int numsSize){
for(int i = 0;i<numsSize;i++){
if(nums[i] < 0 || nums[i] > numsSize-1){
return -1;
}
}
int temp = 0;
for(int i = 0;i<numsSize;i++){
while(nums[nums[i]] != nums[i]){
temp = nums[nums[i]];
nums[nums[i]] = nums[i];
nums[i] = temp;
}
if(nums[i] != i){
return nums[i];
}
}
return -1;
}
注意:
-
for循环中if条件判断
-
数组中交换变量,借助外部变量时需要注意
欢迎小伙伴们可以一起探讨问题,加油!
以上是关于AcWing14:找出数组中重复的数字的主要内容,如果未能解决你的问题,请参考以下文章