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

文章介绍了使用C语言实现链表数据结构,包括节点创建、查找位置、插入操作以及计算多数元素出现的次数。主要展示了如何遍历数组并在链表中维护元素计数。
#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;
}
基于据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于据驱动的Koopman算子的递归神经网络模型线性化”展开,旨在研究纳米定位系统的预测控制问,并提供完整的Matlab代码实现。文章结合据驱动方法与Koopman算子理论,利用递归神经网络(RNN)对非线性系统进行建模与线性化处理,从而提升纳米级定位系统的精度与动态响应性能。该方法通过提取系统隐含动态特征,构建近似线性模型,便于后续模型预测控制(MPC)的设计与优化,适用于高精度自动化控制场景。文中还展示了相关实验验证与仿真结果,证明了该方法的有效性和先进性。; 适合人群:具备一定控制理论基础和Matlab编程能力,从事精密控制、智能制造、自动化或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于纳米级精密定位系统(如原子力显微镜、半导体制造设备)中的高性能控制设计;②为非线性系统建模与线性化提供一种结合深度学习与现代控制理论的新思路;③帮助读者掌握Koopman算子、RNN建模与模型预测控制的综合应用。; 阅读建议:建议读者结合提供的Matlab代码逐段理解算法实现流程,重点关注据预处理、RNN结构设计、Koopman观测矩阵构建及MPC控制器集成等关键环节,并可通过更换实际系统据进行迁移验证,深化对方法泛化能力的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值