你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

C语言/C++——数组中重复的数字问题

[复制链接]
gaosmile 发布时间:2020-5-22 22:50
题目描述


在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例 :
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3

思路分析


首先想到的是暴力法—两个for循环实现,缺点很明显:用时过多。再进一步可以先排序数组然后一次for循环,容易找出所有的重复元素以及重复的次数,用时依旧较长。

我们考虑如果每个数字都置出现一次,那么此时是最完美的,每一个下标i对应元素numbers,也就是说我们对于数组中的每个元素numbers都把它放在自己应该在的位置上numbers[numbers]上, 如果我们发现有两个元素想往同一个位置上放的时候,说明此元素必然重复

即如下的过程:

  • 如果numbers == i, 那么我们认为number这个元素是在自己的位置上的

  • 否则的话,numbers这个元素就应在numbers[numbers]这个位置上, 于是交换numbers和numbers[numbers]。

  • 重复操作1, 直到number== i, 则继续操作下一个位置的元素, 或者numbers == numbers[numbers,元素重复。


代码实现


//#include <stdlib.h>   //C语言

#include<iostream>
using namespace std;

//2020.05.22
int findRepeatNumber(int* nums, int numsSize) {
        //此题无须增加对数组为空、元素个数为0、元素越界情况的判断
        for (int i = 0; i < numsSize; i++) {
                //如果元素位置不对,则交换
                while (nums != i) {
                        //交换前检查是否相等
                        if (nums == nums[nums])
                                return nums;
                        int temp = nums;
                        nums = nums[temp];
                        nums[temp] = temp;
                }
        }
        return -1;
}

int main()
{
        int a[] ={2, 3, 1, 0, 2, 5, 3};

        findRepeatNumber(a,7);
        printf("%d",findRepeatNumber(a,7));
        return 0;

}

微信图片_20200522225102.png
运行结果

收藏 评论0 发布时间:2020-5-22 22:50

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版