c语言练习题(数组)

news2024/10/25 21:14:57

1 只出现一次的数字 III

给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。

你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。

示例 1:

输入:nums = [1,2,1,3,2,5]
输出:[3,5]
解释:[5, 3] 也是有效的答案。

示例 2:

输入:nums = [-1,0]
输出:[-1,0]

示例 3:

输入:nums = [0,1]
输出:[1,0]

提示:

  • 2 <= nums.length <= 3 * 104
  • -231 <= nums[i] <= 231 - 1
  • 除两个只出现一次的整数外,nums 中的其他数字都出现两次

思路:

 暴力解法(嵌套循环)

这是一个比较直接的解法,思路就是通过双重循环来判断每个数出现了几次:

  • 外层循环用于遍历数组中的每一个元素。
  • 内层循环用于统计当前元素在整个数组中出现的次数。
  • 如果某个元素只出现一次,就将其存入结果数组 ret 中。
  • 最后返回结果数组 ret

代码:

int* singleNumber(int* nums, int numsSize, int* returnSize){
    // 初始化 returnSize 为 0,表示还没有存储任何结果
    (*returnSize) = 0;
    
    // 动态分配内存,最坏情况下可能需要返回 numsSize 个元素,但实际上只会返回 2 个
    int* ret = malloc(sizeof(int) * numsSize); 
    
    // 定义计数器和循环变量
    int i, j, count;
    
    // 外层循环遍历数���中的每一个元素
    for (i = 0; i < numsSize; i++) {
        count = 0; // 每次外层循环时,将计数器初始化为 0
        
        // 内层循环统计当前元素 nums[i] 出现的次数
        for (j = 0; j < numsSize; j++) {
            if (nums[i] == nums[j]) {
                count++; // 如果发现相同元素,计数器加 1
            }
        }
        
        // 如果当前元素只出现了一次,将其存入结果数组
        if (count == 1) {
            ret[(*returnSize)++] = nums[i];
        }
    }
    
    // 返回包含两个只出现一次的数的结果数组
    return ret;
}

2合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

示例 1:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

示例 2:

输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1] 和 [] 。
合并结果是 [1] 。

示例 3:

输入:nums1 = [0], m = 0, nums2 = [1], n = 1
输出:[1]
解释:需要合并的数组是 [] 和 [1] 。
合并结果是 [1] 。
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。

提示:

  • nums1.length == m + n
  • nums2.length == n
  • 0 <= m, n <= 200
  • 1 <= m + n <= 200
  • -109 <= nums1[i], nums2[j] <= 109

思路:

  1. 初始化

    • 使用两个指针 p1 和 p2,分别指向 nums1 和 nums2 的起始位置。
    • 创建一个临时数组 sorted,用于存储合并后的有序结果。
  2. 合并过程

    • 使用 while 循环,当 p1 或 p2 未到达各自数组的末尾时,继续合并。
    • 在循环中,比较 nums1[p1] 和 nums2[p2]
      • 如果 nums1[p1] 较小,则将 nums1[p1] 放入 sorted 中,并移动 p1 指针。
      • 如果 nums2[p2] 较小,则将 nums2[p2] 放入 sorted 中,并移动 p2 指针。
      • 如果 p1 已经到达 nums1 的末尾,则将剩余的 nums2[p2] 依次放入 sorted 中。
      • 如果 p2 已经到达 nums2 的末尾,则将剩余的 nums1[p1] 依次放入 sorted 中。
  3. 结果存储

    • 将 sorted 数组中的元素复制回 nums1,以完成合并

代码:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
   int p1 = 0, p2 = 0;  // 初始化两个指针,p1 用于 nums1,p2 用于 nums2
int sorted[m + n];   // 创建一个数组 sorted,用于存放合并后的结果
int cur;             // 当前要插入的数字

// 当 p1 或 p2 还没有到达各自数组的末尾时,继续合并
while (p1 < m || p2 < n) {
    // 如果 nums1 已经遍历完(p1 == m),直接取 nums2 的当前元素
    if (p1 == m) {
        cur = nums2[p2++];
    } 
    // 如果 nums2 已经遍历完(p2 == n),直接取 nums1 的当前元素
    else if (p2 == n) {
        cur = nums1[p1++];
    } 
    // 如果 nums1 当前元素小于 nums2 当前元素,则取 nums1 的当前元素
    else if (nums1[p1] < nums2[p2]) {
        cur = nums1[p1++];
    } 
    // 否则,取 nums2 的当前元素
    else {
        cur = nums2[p2++];
    }
    // 将当前元素放入 sorted 数组中
    sorted[p1 + p2 - 1] = cur;  
}

// 将合并后的结果赋值回 nums1
for (int i = 0; i != m + n; ++i) {
    nums1[i] = sorted[i]; 
}

}

思路2:

  1. 将 nums2 复制到 nums1 的末尾

    • 使用一个循环,将 nums2 中的所有元素依次复制到 nums1 中从 m 开始的位置。即 nums1[m + i] = nums2[i]
  2. 对 nums1 进行排序

    • 使用选择排序算法对 nums1 进行排序。选择排序的基本思想是每次从未排序的部分中找到最小的元素,然后将其放到已排序部分的末尾。
    • 通过嵌套循环,外层循环遍历 nums1 数组的每一个位置,内层循环从当前位置开始,找到未排序部分中的最小元素,并将其与当前位置的元素交换。

代码2:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    // 将 nums2 中的元素复制到 nums1 后面的空白部分
    for (int i = 0; i < n; i++) {
        nums1[m + i] = nums2[i];  // m 是 nums1 中有效元素的个数,nums2 的元素将从 nums1[m] 开始复制
    }

    // 使用简单的选择排序算法对整个 nums1 数组进行排序
    for (int k = 0; k < m + n; k++) {
        for (int j = k; j < m + n; j++) {
            // 如果 nums1[j] 比 nums1[k] 小,交换这两个元素
            if (nums1[j] < nums1[k]) {  
                int temp = nums1[k];
                nums1[k] = nums1[j];
                nums1[j] = temp;
            }
        }
    }
}

3有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

示例 2:

输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 已按 非递减顺序 排序

思路:

数组其实是有序的, 只不过负数平方之后可能成为最大数了。
那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
此时可以考虑双指针法了,i指向起始位置,j指向终止位置。 先建立一个和题目中大小一样的数组 再让k指向result数组终止位置,这样新数组就会从后往前依次的到原数组中非递减的数字的平方 此时比较左右指针的平方大小,把较大的平方数字放在新数组中,而后原数组中较大的平方数组指针逐渐移动。

代码:


int* sortedSquares(int* nums, int numsSize, int* returnSize){
    //返回的数组大小就是原数组大小
    *returnSize = numsSize;
    //创建两个指针,right指向数组最后一位元素,left指向数组第一位元素
    int right = numsSize - 1;
    int left = 0;

    //最后要返回的结果数组
    int* result = (int*)malloc(sizeof(int) * numsSize);
    int index;
    for(index = numsSize - 1; index >= 0; index--) {
        //左指针指向元素的平方
        int leftnum = nums[left] * nums[left];
        //右指针指向元素的平方
        int rightnum = nums[right] * nums[right];
        //若左指针指向元素平方比右指针指向元素平方大,将左指针指向元素平方放入结果数组。左指针右移一位
        if(leftnum> rightnum) {
            result[index] = leftnum;
            left++;
        } 
        //若右指针指向元素平方比左指针指向元素平方大,将右指针指向元素平方放入结果数组。右指针左移一位
        else {
            result[index] = rightnum;
            right--;
        }
    }
    //返回结果数组
    return result;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2223551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python爬虫进阶(实战篇一)

接&#xff0c;基础篇&#xff0c;链接&#xff1a;python爬虫入门&#xff08;所有演示代码&#xff0c;均有逐行分析&#xff01;&#xff09;-CSDN博客 目录 1.爬取博客网站全部文章列表 ps:补充&#xff08;正则表达式&#xff09; 爬虫实现 爬虫代码&#xff1a; 2.爬…

java控制台打印乘法口诀表

目录 前言具体代码完整代码 前言 背乘法口诀表我没记错话&#xff0c;应该是我们在上小学二年级的时候&#xff0c;相信大家对乘法表相当熟悉&#xff0c;那你知道如何用java打印这个漂亮的表吗&#xff1f;下面咱们一起来学习学习。 具体代码 数字乘法表 关键代码&#xf…

shell编程实例1—猜数字游戏

脚本生成一个100以内的随机数&#xff0c;提示用户猜数字&#xff0c;根据用户的输入&#xff0c;提示用户猜对了&#xff0c; 猜小了或猜大了&#xff0c;直至用户才对数字结束 #!/bin/bash #脚本生成一个100以内的随机数&#xff0c;提示用户猜数字&#xff0c;根据用户的输…

大模型生图安全疫苗注入——进阶解决方案与系统优化(DataWhale组队学习)

引言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;上篇博客中&#xff0c;我们基于DataWhale 2024年10月大模型生图安全疫苗注入赛道的任务&#xff0c;介绍了攻击与防御的基本策略&#xff0c;如通过上下文稀释法、隐喻替换等绕过检测机制&#xff0c;并提出了多…

分布式IO模拟量模块:多领域应用的高效能解决方案

分布式IO模拟量模块是分布式IO系统中的重要组件&#xff0c;用于实现现场设备或过程的模拟量信号的采集、监视和控制。该模块通常与现场总线耦合器配合使用&#xff0c;能够接收来自现场设备的模拟量信号&#xff08;如电流、电压等&#xff09;&#xff0c;并将其转换为数字信…

利用飞腾派进行OpenCV开发

实验目标&#xff1a; 完成飞腾平台OpenCV开发。 实验大纲&#xff1a; Mat数据结构加载、显示、保存图像读写像素RGB图像分离彩色图转灰度图 Mat数据结构 Mat是一个类&#xff0c;由两个数据部分组成&#xff1a;矩阵头(大小,通道,数据类型等)和数据块(像素 值)。创建示例…

Chat-macOS:HuggingChat 开源 MACOS 原生 AI 聊天神器,让你的 Mac 变成智能助手!

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; &#x1f966; 微信公众号&#xff…

毕业设计—基于 Inception-ResNet模型的皮肤癌分类系统实现

1.摘要 皮肤癌是人类最常见的恶性肿瘤&#xff0c;主要通过视觉诊断进行初步临床筛查。但是由于皮肤病变外观的细微变化性&#xff0c;使用图像自动分类皮肤病变是一项具有挑战性的任务。本文为了提高深度学习算法在皮肤病检测上的准确率&#xff0c;本文提出了基于Inception和…

bootstrap模态框myModalLabel遇到做复制的功能失效解决方案整理

bootstrap模态框myModalLabel遇到做复制的功能失效解决方案整理 解决办法&#xff1a;标红色的去掉就可以 tabindex“-1”

SOLIDWORKS专业版企业购买多少钱一套?

SOLIDWORKS正版软件分为三个版本&#xff0c;主要以每个版本的功能不同对价格进行划分&#xff0c;SOLIDWWORKS代理商硕迪科技将为企业提供优惠的采购价格&#xff0c;欢迎通过电话或者在线咨询联系我们&#xff0c;洽谈价格和服务。 ▲ SOLIDWORKS Professional 是应用最为广…

网站建设中需要注意哪些安全问题?----雷池社区版

服务器与应用安全指南 1. 服务器安全 1.1 操作系统安全 及时更新补丁&#xff1a;确保操作系统始终安装最新补丁&#xff0c;以防范系统漏洞。例如&#xff0c;Windows Server 定期推送安全更新&#xff0c;修复如远程代码执行等潜在威胁。优化系统服务配置&#xff1a;关闭不…

什么是3D展厅?有哪些应用场景?

3D展厅是一种利用三维技术构建的虚拟展示空间。它借助虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;等现代科技手段&#xff0c;将真实的展示空间数字化&#xff0c;呈现出逼真、立体、沉浸的展示效果。视创云展通过整合虚拟展厅、数字人互动、音视…

【真题笔记】09-12年系统架构设计师要点总结

【真题笔记】09-12年系统架构设计师要点总结 41 视图DSSA&#xff08;特定领域架构&#xff09;集成系统数据库管理设计模式操作符运算符综合布线备份数据库集成工作流技术软件质量保证需求管理需求开发结构化方法企业战略数据模型事务数据库主题数据库系统设计原型开发静态分析…

组件通信八种方式(vue3)

一、父传子&#xff08;props&#xff09; 关于Props的相关内容可以参考&#xff1a;Props-CSDN博客 父组件通过 props 向子组件传递数据。适合简单的单向数据流。 <!-- Parent.vue --> <template><Child :message"parentMessage" /> </temp…

useEffect简单介绍

react组件生命周期 比如说&#xff0c;某些操作就只在初始渲染后执行&#xff0c;我们就可以使用useEffect。 useEffect(function () {fetch(http://www.omdbapi.com/?apikey${KEY}&sinterstellar).then((res) > res.json()).then((data) > setMovies(data.Search)…

[C#][winform]基于yolov5的驾驶员抽烟打电话安全带检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面

【重要说明】 该系统以opencvsharp作图像处理,onnxruntime做推理引擎&#xff0c;使用CPU进行推理&#xff0c;适合有显卡或者没有显卡windows x64系统均可&#xff0c;不支持macOS和Linux系统&#xff0c;不支持x86的windows操作系统。由于采用CPU推理&#xff0c;要比GPU慢。…

传统数据仓库升级版:云数据仓库!

随着公司业务拓展&#xff0c;数据爆炸性增长&#xff0c;数据驱动的见解已成为决策过程中关键指标。对公司来说&#xff0c;怎么选择存储所有这些信息的简单方法并运行必要的数据分析以获得有用的见解变得更加重要。 在过去的50多年里&#xff0c;传统的本地数据仓库一直是一…

ffmpeg视频滤镜:腐蚀滤镜

滤镜简述 erosion 官网链接> FFmpeg Filters Documentation 这个滤镜会在视频上应用腐蚀操作&#xff0c;腐蚀操作是形态学中一种操作&#xff0c;接触过opencv的同学应该很熟悉。滤镜主要有如下作用&#xff1a; 去除噪声&#xff1a;腐蚀可以帮助去除图像中的小颗粒噪…

构建后端为etcd的CoreDNS的容器集群(六)、编写自动维护域名记录的代码脚本

本文为系列测试文章&#xff0c;拟基于自签名证书认证的etcd容器来构建coredns域名解析系统。 一、前置文章 构建后端为etcd的CoreDNS的容器集群&#xff08;一&#xff09;、生成自签名证书 构建后端为etcd的CoreDNS的容器集群&#xff08;二&#xff09;、下载最新的etcd容…

pytorch训练和使用resnet

pytorch训练和使用resnet 使用 CIFAR-10数据集 训练 resnet resnet-train.py import torch import torchvision import torchvision.transforms as transforms import torch.nn as nn import torch.optim as optim# 在CIFAR-10数据集中 # 训练集&#xff1a;包含50000张图像…