【刷题】找出数组中出现次数大于a的数

#include <float.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define LEN 100
int arr[LEN] = {0};

struct DL_list {
    int num;
    int cnt;
    struct DL_list *prev;
    struct DL_list *next;
};

struct DL_list *head = NULL;
struct DL_list *tail = NULL;

static struct DL_list *creat_node(int num)
{
    struct DL_list *node = (struct DL_list *)malloc(sizeof(struct DL_list));
    node->num = num;
    node->cnt = 1;;
    node->prev = NULL;
    node->next = NULL;
    if (head == NULL) { // 第一个节点,head/tail指针指向该节点并初始化
        head = node;
        tail = node;
    }
    return node;
}

// condition:-1:在该节点前边;0:该节点;1:在该节点后边;2:空链表
#define BEFORE (-1)
#define FINDIN 0
#define AFTER 1
#define NULLLIST 2
static bool find_num(int num, struct DL_list *node, int *condition)
{
    if (head == NULL) { // 链表中还没有节点,直接返回,进行插入操作
        *condition = NULLLIST;
        return false;
    }

    for (node = head; node->next != NULL; node = node->next) {
        if (node->num == num) {
            *condition = FINDIN;
            return true;
        } else if (num < node->num){ // 如果小于该数,则插入该节点前边
            *condition = BEFORE;
            return false;
        } else if (num > node->num){ // 如果大于该数,则插入该节点后边
            *condition = AFTER;
            return false;
        }
    }
}

static void insert_node(struct DL_list *new, struct DL_list *node, int condition)
{
    if (condition == BEFORE) {
        new->next = node;
        new->prev = node->prev;
        if (node->prev != NULL) { // node不是第一个节点
            node->prev->next = new;
        } else { // node是第一个节点
            head = new;
        }
        node->prev = new;
    } else if (condition == AFTER) {
        new->next = node->next;
        new->prev = node;
        if (node->next != NULL) { // node不是最后一个节点
            node->next->prev = new;
        } else { // node是最后一个节点
            tail = new;
        }
        node->next = new;
    }
}

static void print_num(int a, struct DL_list *list)
{
    struct DL_list *node;
    int i = 0;
    for (node = list; node->next != NULL; node = node->next) {
        ++i;
        printf("[%d]node_num:%d, node->cnt:%d\n", i, node->num, node->cnt);
        if (node->cnt > a) {
            printf("[%d]node_num:%d, node->cnt:%d > %d\n", i, node->num, node->cnt, a);
        }
    }
}

int majorityElement(int* nums, int numsSize){
    int a = numsSize / 3;
    bool ret = false;
    struct DL_list *node;
    struct DL_list *new;
    int condition;

    for (int i = 0; i < numsSize; i++) {
        // 遍历链表,判断当前num是否已记录,并找到num的位置
        ret = find_num(nums[i], node, &condition);
        // 如果有,增加计数
        if (ret) {
            node->cnt++;
        } else {
        // 如果没有,创建节点,保存该num
            new = creat_node(nums[i]);
        // 插入该节点到链表中
            insert_node(new, node, condition);
        }
    }
        // 遍历链表,打印出现次数大于a的num
    print_num(a, head);





    // for (int i = 0; i < LEN; i++) {
    //     if (arr[i] > a) { 
    //         printf("%d ", i);
    //     }
    // }

    return 0;
}

#define CNT 3

int main() {
    int nums[CNT] = {3,2,3};
    // int nums[CNT] = {1};
    // int nums[CNT] = {1,1,1,3,3,2,2,2};

    majorityElement(nums, CNT);

    return 0;
}




#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

char buf[2000] = {0};
int num[1000] = {0};
int mp[1000] = {0};
int n, time;

static void get_input(void)
{
    // 获取任务列表
    scanf("%s", buf);
    int x = 0; // 任务编号数字
    n = 0; // 获取任务个数
    // 任务列表字符串转换为任务数组
    for (int i = 0; buf[i] != '\0'; i++) {
        if (buf[i] == ',') {
            // 保存获取到的任务编号数字到数组
            num[n++] = x;
            x = 0;
        } else {
            // 编号字符串转换为数值
            x = x * 10 + buf[i] - '0'; // 当前位数值 + 前几位数字扩大十倍
        }
    }
    num[n++] = x; // 记录最后一个任务编码

    x = 0;
    // 获取间隔时长
    scanf("%d", &time);
}

int main() {
    get_input();

    int mx = 0; // 记录执行最多次任务的执行次数
    // 计算各任务执行的次数
    for (int i = 0; i < n; i++) {
        mp[num[i]]++; // 统计当前遍历到的任务执行次数
        if (mp[num[i]] > mx) {
            mx = mp[num[i]]; // 记录执行最多次任务的执行次数
        }
    }

    int need = (time + 1) * (mx - 1); // ?
    for (int i = 0; i < 1000; i++) {
        if (mp[i] != mx) { // 非执行次数最多的任务,
            continue;
        }
        need++; // ? 执行任务次数最多的任务,等待时间+1
    }
    printf("%d", need > n ? need : n); // ?

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值