牛客网刷题 | BC126 小乐乐查找数字

😁博客主页😁:🚀从0至1-优快云博客🚀
🤑博客内容🤑:🍭C语言、C++、数据结构、嵌入式、Linux🍭
😎本文内容🤣:🍭BC126 小乐乐查找数字🍭
😎金句分享😎:🍭NO🍭

目录

目录

描述

输入描述:

输出描述:

示例

解题思路 

理解输入和输出

设计算法

代码

更多代码 

课后拓展 

拓展1: 支持更大的数组

解题思路

拓展2: 统计多个目标数字

解题思路

实现代码

拓展3: 处理负数

解题思路

实现代码 

拓展4: 使用哈希表

解题思路

实现代码 

拓展5: 图形化展示

解题思路

实现代码


描述

给定n个整数和一个整数x,小乐乐想从n个整数中判断x出现几次,请编程帮他实现。

输入描述:

共3行
第一行,一个整数,表示n(1 <= n <= 100)。
第二行,共输入n个整数,两个整数之间用空格分隔。
第三行,输入一个整数,表示要查找的整数x。

输出描述:

一行,表示整数x出现的次数。

示例


解题思路 

理解输入和输出

  • 输入:
    • 数组长度 a
    • 数组元素(共 a 个)。
    • 目标数字 b
  • 输出:
    • 目标数字 b 在数组中出现的次数。

设计算法

  1. 读取数组长度:
    • 使用 scanf 函数读取用户输入的数组长度 a
  2. 读取数组元素:
    • 使用一个 for 循环从用户那里读取 a 个整数,并将它们存储在数组 arr 中。
  3. 读取目标数字:
    • 使用 scanf 函数读取用户输入的目标数字 b
  4. 统计目标数字出现的次数:
    • 初始化计数器 count 为 0
    • 使用另一个 for 循环遍历数组 arr,如果当前元素等于目标数字 b,则增加 count 的值。
  5. 输出结果:
    • 使用 printf 函数输出目标数字 b 在数组中出现的次数。

代码

#include <stdio.h>

int main() 
{
    int a;
    int b = 0;
    int i;
    int count = 0; // 初始化 count 为 0
    int arr[100] = {0};
    
    scanf("%d", &a); // 输入数组长度
    
    for(i = 0; i < a; i++)
    {
        scanf("%d", &arr[i]); // 输入数组元素
    }
    
    scanf("%d", &b); // 输入要查找的目标数字
    for(i = 0; i < a; i++)
    {
        if(arr[i] == b)
        {
            count++; // 统计目标数字出现的次数
        }
    }
    
    printf("%d\n", count); // 输出目标数字出现的次数
    return 0;
}

/*-----------------------------------------------------------------*/

/*以下是加注释后的*/

#include <stdio.h>

int main() 
{
    int a;              // 声明变量 a 用于存储数组长度
    int b = 0;          // 声明变量 b 用于存储要查找的目标数字,初始值为 0
    int i;              // 声明变量 i 作为循环控制变量
    int count = 0;      // 声明变量 count 用于统计目标数字出现的次数,初始值为 0
    int arr[100] = {0}; // 声明数组 arr 用于存储输入的数组元素,最大支持 100 个元素

    scanf("%d", &a);    // 输入数组长度并存储在变量 a 中

    for(i = 0; i < a; i++) // 使用 for 循环读取数组元素
    {
        scanf("%d", &arr[i]); // 输入当前数组元素并存储在 arr[i] 中
    }
    
    scanf("%d", &b);    // 输入要查找的目标数字并存储在变量 b 中
    for(i = 0; i < a; i++) // 使用 for 循环遍历数组元素
    {
        if(arr[i] == b) // 如果当前元素等于目标数字 b
        {
            count++;    // 增加 count 的值,统计目标数字出现的次数
        }
    }
    
    printf("%d\n", count); // 输出目标数字在数组中出现的次数
    return 0;             // 返回 0 表示程序成功结束
}
  1. 变量声明:

    int a;
    int b = 0;
    int i;
    int count = 0; // 初始化 count 为 0
    int arr[100] = {0};
    • a: 存储数组的长度。
    • b: 存储要查找的目标数字。
    • i: 循环控制变量。
    • count: 用于统计目标数字出现的次数,初始值为 0
    • arr[100]: 存储输入的数组元素,最大支持100个元素。
  2. 读取数组长度:

    scanf("%d", &a);
    • 用户输入数组的长度并存储在变量 a 中。
  3. 读取数组元素:

    for(i = 0; i < a; i++)
    {
        scanf("%d", &arr[i]);
    }
    • 使用 for 循环读取用户输入的数组元素,并存储在数组 arr 中。
  4. 读取目标数字:

    scanf("%d", &b);
    • 用户输入要查找的目标数字并存储在变量 b 中。
  5. 统计目标数字出现的次数:

    for(i = 0; i < a; i++)
    {
        if(arr[i] == b)
        {
            count++;
        }
    }
    • 使用 for 循环遍历数组,如果当前元素等于目标数字 b,则增加 count 的值。
  6. 输出结果:

    printf("%d\n", count);
    • 输出目标数字在数组中出现的次数。

更多代码 

#include<stdio.h>
int main(){//桶排
    int arr[100]={0};//100个桶初始化为0
    int n=0;
    int temp=0;//桶的编号
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&temp);//获得桶编号
        arr[temp]++;//temp对应数的桶里,出现就自增,即为出现次数
    }
    int index=0;
    scanf("%d",&index);
    printf("%d",arr[index]);
    return 0;
}
#include <stdio.h>

int main() 
{
    int n = 0;          // 存储数组长度
    int input = 0;      // 存储当前输入的数组元素
    int x = 0;          // 存储要查找的目标数字
    int count[1000] = {0}; // 用于统计每个数字出现的次数,最多支持1000个不同的数字

    scanf("%d", &n);    // 输入数组长度

    // 使用 while 循环读取数组元素,并统计每个数字出现的次数
    while (n--) {
        scanf("%d", &input); // 读取当前数组元素
        count[input]++;      // 增加对应数字的计数
    }

    scanf("%d", &x);    // 输入要查找的目标数字

    printf("%d\n", count[x]); // 输出目标数字在数组中出现的次数

    return 0;
}



  1. 变量声明:

    int n = 0;          // 存储数组长度
    int input = 0;      // 存储当前输入的数组元素
    int x = 0;          // 存储要查找的目标数字
    int count[1000] = {0}; // 用于统计每个数字出现的次数,最多支持1000个不同的数字
  2. 读取数组长度:

    scanf("%d", &n);    // 输入数组长度
  3. 读取数组元素并统计次数:

    while (n--) {
        scanf("%d", &input); // 读取当前数组元素
        count[input]++;      // 增加对应数字的计数
    }
    • 使用 while 循环读取数组元素,并将每个数字的出现次数存储在 count 数组中。
  4. 读取目标数字:

    scanf("%d", &x);    // 输入要查找的目标数字
  5. 输出结果:

    printf("%d\n", count[x]); // 输出目标数字在数组中出现的次数
    • 输出目标数字 x 在数组中出现的次数。

课后拓展 

拓展1: 支持更大的数组

当前代码支持的最大数组长度为100。如果我们需要处理更大的数组,可以通过动态内存分配来实现。

解题思路

  1. 动态内存分配:

    • 使用 malloc 函数动态分配内存以存储数组元素。
    • 检查内存分配是否成功,如果失败则输出错误信息并退出程序。
  2. 读取数组元素:

    • 使用 for 循环从用户那里读取数组元素,并存储在动态分配的数组中。
  3. 统计目标数字出现的次数:

    • 初始化计数器 count 为 0
    • 使用 for 循环遍历数组,如果当前元素等于目标数字 b,则增加 count 的值。
  4. 输出结果:

    • 使用 printf 函数输出目标数字 b 在数组中出现的次数。
  5. 释放内存:

    • 使用 free 函数释放动态分配的内存,避免内存泄漏。
#include <stdio.h>
#include <stdlib.h>

int main() 
{
    int a;              // 声明变量 a 用于存储数组长度
    int b = 0;          // 声明变量 b 用于存储要查找的目标数字,初始值为 0
    int i;
    int count = 0;      // 声明变量 count 用于统计目标数字出现的次数,初始值为 0
    int *arr;           // 声明指针 arr 用于动态分配数组

    scanf("%d", &a);    // 输入数组长度并存储在变量 a 中

    // 动态分配内存
    arr = (int *)malloc(a * sizeof(int));
    if (arr == NULL) {
        printf("Memory allocation failed\n"); // 内存分配失败时输出错误信息
        return 1;                             // 返回 1 表示程序异常结束
    }

    for(i = 0; i < a; i++) // 使用 for 循环读取数组元素
    {
        scanf("%d", &arr[i]); // 输入当前数组元素并存储在 arr[i] 中
    }
    
    scanf("%d", &b);    // 输入要查找的目标数字并存储在变量 b 中
    for(i = 0; i < a; i++) // 使用 for 循环遍历数组元素
    {
        if(arr[i] == b) // 如果当前元素等于目标数字 b
        {
            count++;    // 增加 count 的值,统计目标数字出现的次数
        }
    }
    
    printf("%d\n", count); // 输出目标数字在数组中出现的次数

    // 释放动态分配的内存
    free(arr);

    return 0;             // 返回 0 表示程序成功结束
}



拓展2: 统计多个目标数字

如果需要统计多个目标数字的出现次数,可以使用一个循环来多次读取目标数字并输出结果。

解题思路

  1. 读取数组长度和数组元素:

    • 使用 scanf 函数读取数组长度 a
    • 使用 for 循环从用户那里读取数组元素,并存储在数组 arr 中。
  2. 读取目标数字的数量:

    • 使用 scanf 函数读取要查找的目标数字的数量 num_targets
  3. 统计每个目标数字的出现次数:

    • 使用嵌套的 for 循环:
      • 外层循环遍历每个目标数字。
      • 内层循环遍历数组,统计目标数字出现的次数。
    • 使用 count 数组来存储每个目标数字的出现次数。
  4. 输出结果:

    • 对于每个目标数字,输出其在数组中出现的次数。

实现代码

#include <stdio.h>

int main() 
{
    int a;              // 声明变量 a 用于存储数组长度
    int num_targets;    // 声明变量 num_targets 用于存储要查找的目标数字的数量
    int i, j;
    int count[1000] = {0}; // 声明数组 count 用于统计每个数字出现的次数,最多支持1000个不同的数字
    int arr[100];         // 声明数组 arr 用于存储输入的数组元素,最大支持 100 个元素
    int targets[100];     // 声明数组 targets 用于存储要查找的目标数字

    scanf("%d", &a);    // 输入数组长度并存储在变量 a 中

    for(i = 0; i < a; i++) // 使用 for 循环读取数组元素
    {
        scanf("%d", &arr[i]); // 输入当前数组元素并存储在 arr[i] 中
    }
    
    scanf("%d", &num_targets); // 输入要查找的目标数字的数量

    for(j = 0; j < num_targets; j++) // 使用 for 循环读取每个目标数字
    {
        scanf("%d", &targets[j]); // 输入当前目标数字并存储在 targets[j] 中
        for(i = 0; i < a; i++) // 使用 for 循环遍历数组元素
        {
            if(arr[i] == targets[j]) // 如果当前元素等于目标数字 targets[j]
            {
                count[targets[j]]++; // 增加对应目标数字的计数
            }
        }
        printf("%d\n", count[targets[j]]); // 输出目标数字在数组中出现的次数
    }

    return 0;             // 返回 0 表示程序成功结束
}



拓展3: 处理负数

当前代码假设数组中的所有元素都是非负整数。如果需要处理负数,可以调整数组 count 的大小和索引方式。

解题思路

  1. 调整数组大小:

    • 使用更大的数组 count 来支持负数。
    • 定义一个偏移量 OFFSET,使得负数也能映射到数组的有效索引范围内。
  2. 读取数组长度和数组元素:

    • 使用 scanf 函数读取数组长度 a
    • 使用 for 循环从用户那里读取数组元素,并存储在数组 arr 中。
  3. 统计目标数字的出现次数:

    • 初始化计数器 count 为 0
    • 使用 for 循环遍历数组,如果当前元素等于目标数字 b,则增加 count[b + OFFSET] 的值。
  4. 输出结果:

    • 使用 printf 函数输出目标数字 b 在数组中出现的次数。
实现代码 
#include <stdio.h>

#define MAX_NUM 1000
#define OFFSET 500

int main() 
{
    int a;              // 声明变量 a 用于存储数组长度
    int b = 0;          // 声明变量 b 用于存储要查找的目标数字,初始值为 0
    int i;
    int count[2 * MAX_NUM + 1] = {0}; // 声明数组 count 用于统计每个数字出现的次数,支持 -MAX_NUM 到 MAX_NUM
    int arr[100];         // 声明数组 arr 用于存储输入的数组元素,最大支持 100 个元素

    scanf("%d", &a);    // 输入数组长度并存储在变量 a 中

    for(i = 0; i < a; i++) // 使用 for 循环读取数组元素
    {
        scanf("%d", &arr[i]); // 输入当前数组元素并存储在 arr[i] 中
    }
    
    scanf("%d", &b);    // 输入要查找的目标数字并存储在变量 b 中
    for(i = 0; i < a; i++) // 使用 for 循环遍历数组元素
    {
        if(arr[i] == b) // 如果当前元素等于目标数字 b
        {
            count[b + OFFSET]++; // 增加对应目标数字的计数
        }
    }
    
    printf("%d\n", count[b + OFFSET]); // 输出目标数字在数组中出现的次数

    return 0;             // 返回 0 表示程序成功结束
}



拓展4: 使用哈希表

对于更大范围的数字或更高效的统计,可以使用哈希表(散列表)来存储和统计数字的出现次数。

解题思路

  1. 定义哈希表结构体:

    • 定义一个 HashNode 结构体,包含键、值和指向下一个节点的指针。
    • 定义一个大小固定的哈希表数组 hashTable
  2. 哈希函数:

    • 定义一个简单的哈希函数 hashFunction,将键映射到哈希表的索引位置。
  3. 插入和更新操作:

    • 定义 insert 函数,在哈希表中插入一个新的键值对。
    • 定义 increment 函数,增加指定键的值。
  4. 查询操作:

    • 定义 getCount 函数,获取指定键的值。
  5. 释放内存:

    • 定义 freeHashTable 函数,释放哈希表占用的内存。
  6. 读取数组长度和数组元素:

    • 使用 scanf 函数读取数组长度 a
    • 使用 for 循环从用户那里读取数组元素,并调用 increment 函数更新哈希表。
  7. 读取目标数字:

    • 使用 scanf 函数读取要查找的目标数字 b
  8. 输出结果:

    • 使用 getCount 函数获取目标数字 b 在数组中出现的次数,并使用 printf 函数输出结果。
  9. 释放哈希表内存:

    • 调用 freeHashTable 函数释放哈希表占用的内存。
实现代码 
#include <stdio.h>
#include <stdlib.h>

#define HASH_SIZE 1000

typedef struct HashNode {
    int key;
    int value;
    struct HashNode* next;
} HashNode;

HashNode* hashTable[HASH_SIZE];

unsigned int hashFunction(int key) {
    return abs(key) % HASH_SIZE; // 计算哈希值
}

void insert(HashNode** table, int key) {
    unsigned int index = hashFunction(key);
    HashNode* newNode = (HashNode*)malloc(sizeof(HashNode));
    newNode->key = key;
    newNode->value = 1;
    newNode->next = table[index];
    table[index] = newNode;
}

void increment(HashNode** table, int key) {
    unsigned int index = hashFunction(key);
    HashNode* current = table[index];
    while (current != NULL) {
        if (current->key == key) {
            current->value++;
            return;
        }
        current = current->next;
    }
    insert(table, key);
}

int getCount(HashNode** table, int key) {
    unsigned int index = hashFunction(key);
    HashNode* current = table[index];
    while (current != NULL) {
        if (current->key == key) {
            return current->value;
        }
        current = current->next;
    }
    return 0;
}

void freeHashTable(HashNode** table) {
    for (int i = 0; i < HASH_SIZE; i++) {
        HashNode* current = table[i];
        while (current != NULL) {
            HashNode* temp = current;
            current = current->next;
            free(temp);
        }
    }
}

int main() 
{
    int a;              // 声明变量 a 用于存储数组长度
    int b = 0;          // 声明变量 b 用于存储要查找的目标数字,初始值为 0
    int i;
    int arr[100];         // 声明数组 arr 用于存储输入的数组元素,最大支持 100 个元素

    scanf("%d", &a);    // 输入数组长度并存储在变量 a 中

    for(i = 0; i < a; i++) // 使用 for 循环读取数组元素
    {
        scanf("%d", &arr[i]); // 输入当前数组元素并存储在 arr[i] 中
        increment(hashTable, arr[i]); // 增加对应数字的计数
    }
    
    scanf("%d", &b);    // 输入要查找的目标数字并存储在变量 b 中
    
    printf("%d\n", getCount(hashTable, b)); // 输出目标数字在数组中出现的次数

    freeHashTable(hashTable); // 释放哈希表占用的内存

    return 0;             // 返回 0 表示程序成功结束
}



拓展5: 图形化展示

如果希望以图形化的方式展示结果,可以使用简单的字符图形或调用图形库(如SDL、OpenGL等)。这里我们使用简单的字符图形来展示。

解题思路

  1. 读取数组长度和数组元素:

    • 使用 scanf 函数读取数组长度 a
    • 使用 for 循环从用户那里读取数组元素,并存储在数组 arr 中。
  2. 读取目标数字:

    • 使用 scanf 函数读取要查找的目标数字 b
  3. 统计目标数字的出现次数:

    • 初始化计数器 count 为 0
    • 使用 for 循环遍历数组,如果当前元素等于目标数字 b,则增加 count 的值。
  4. 输出结果:

    • 使用 printf 函数输出目标数字 b 在数组中出现的次数。
  5. 简单字符图形展示:

    • 使用 for 循环打印星号 * 来表示目标数字出现的次数。
实现代码
#include <stdio.h>

int main() 
{
    int a;              // 声明变量 a 用于存储数组长度
    int b = 0;          // 声明变量 b 用于存储要查找的目标数字,初始值为 0
    int i;
    int count = 0;      // 声明变量 count 用于统计目标数字出现的次数,初始值为 0
    int arr[100];         // 声明数组 arr 用于存储输入的数组元素,最大支持 100 个元素

    scanf("%d", &a);    // 输入数组长度并存储在变量 a 中

    for(i = 0; i < a; i++) // 使用 for 循环读取数组元素
    {
        scanf("%d", &arr[i]); // 输入当前数组元素并存储在 arr[i] 中
    }
    
    scanf("%d", &b);    // 输入要查找的目标数字并存储在变量 b 中
    for(i = 0; i < a; i++) // 使用 for 循环遍历数组元素
    {
        if(arr[i] == b) // 如果当前元素等于目标数字 b
        {
            count++;    // 增加 count 的值,统计目标数字出现的次数
        }
    }
    
    printf("Number of occurrences of %d: %d\n", b, count); // 输出目标数字在数组中出现的次数

    // 简单字符图形展示
    printf("Occurrences:\n");
    for(i = 0; i < count; i++)
    {
        printf("*"); // 打印星号表示一次出现
    }
    printf("\n");

    return 0;             // 返回 0 表示程序成功结束
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值