C语言 数字在升序数组中出现的次数

简介: C语言 数字在升序数组中出现的次数

数字在升序数组中出现的次数

这道题可以用遍历数组二分查找来处理

1.题目描述

2.题目分析

题目中有一个关键信息,非降序数组,我们可以使用if语句来处理这个问题

if(numsLen==0){
        return 0;
    }
else if (nums[numsLen-1]<k||nums[0]>k) {
        return 0;
    }

2.1遍历数组方法

int GetNumberOfK(int* nums, int numsLen, int k ) {
    int count = 0;
    if(numsLen==0){
        return 0;
    }
    else if (nums[numsLen-1]<k||nums[0]>k) {
        return 0;
    }
    for(int i=0;i<numsLen;i++){
        if (k==nums[i]) {
            count++;
        }
    }
    return count;
}

遍历数组的方法应该是最直接有效的,当k出现一次,则count自增,最终返回count的值即是k出现的次数

2.2二分查找方法

二分查找是我们经常使用的一种算法,他的逻辑是

升序或者降序无重复元素的数组中,比较目标值和数组中间值的方法,每次缩小一半的搜索范围,相比遍历可以加快计算的速度

假设:目标值为下标为4的数值,给定一个大小为10的数组,我们给定他的下界left=0,上界right=numsLen-1,中间下标mid=(left+right)/2

二分查找:

  • 判断目标值target是否等于num[mid];
  • 如果相等则返回mid

如果不相等则判断target与num[mid]的大小关系;

  • target>num[mid];则说明目标值在后半部分,因为mid与目标值不相等,那么left就变成mid+1;
  • target<num[mid];则说明目标值在前半部分,因为mid与目标值不相等,那么right就变成mid-1;

每次缩小范围后都需要继续执行上述步骤,我们可以使用一个while循环,当left<right的时候循环,直到找到目标值对应的下标,返回下标;或者没有目标值对应的下标,返回-1;

2.3代码示例

按照这个思路,我们编写一下我们的代码

int position(int* data, int n, double k){
    int left = 0, right = n-1, mid = 0;
    while(left <= right){
        mid = (left + right)/2;
        if(data[mid] < k)
            left = mid + 1;
        else if(data[mid] > k)
            right = mid - 1;
        else
            return mid;
        }
    return left;
}

当然,这是二分查找的代码,根据题目要求,我们调用这个函数

int GetNumberOfK(int* nums, int numsLen, int k ){
    return position(nums,numsLen, k+0.5) - position(nums,numsLen, k-0.5);
}

找到比k小的第一个数作为左边界,找到比k大的第一个数作为右边界,右-左即k的个数

按普通找某个数的位置来找,只是把int 改为double, 找k-0.5和k+0.5

相关文章
|
18小时前
|
存储 编译器 C语言
C语言之数组
C语言之数组
24 0
|
18小时前
|
C语言
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
|
18小时前
|
C语言
在C语言中数组作为函数参数的应用与示例
在C语言中数组作为函数参数的应用与示例
17 0
|
19小时前
|
C语言
【进阶C语言】数组笔试题解析
【进阶C语言】数组笔试题解析
22 0
|
18小时前
|
C语言
每天一道C语言编程(数组操作)
每天一道C语言编程(数组操作)
5 0
|
18小时前
|
C语言
每天一道C语言编程(第一弹~):数组
每天一道C语言编程(第一弹~):数组
8 0
|
18小时前
|
机器学习/深度学习 C语言
C语言三维数组的创建
该代码片段展示了如何在C语言中创建一个动态的3D数组。由于`n`在编译时未知,不能直接声明为`int f[n][n][n]`。正确的方法是使用`malloc`进行动态内存分配。首先分配`n`个`int **`,然后对每一层分配`n`个`int *`,最后每个元素分配`n`个`int`。之后可以使用这个3D数组,并在完成后正确释放内存。
11 2
|
18小时前
|
C语言
数组深入剖析(C语言基础入门)
数组深入剖析(C语言基础入门)
|
18小时前
|
存储 C语言
C语言中字符串的引用与数组元素操作
C语言中字符串的引用与数组元素操作
23 0
|
18小时前
|
存储 人工智能 程序员
爱上C语言:超详细讲解数组,学数组看这一篇就够了(数组篇)
爱上C语言:超详细讲解数组,学数组看这一篇就够了(数组篇)

热门文章

最新文章