当前位置: 首页 > news >正文

力推C语言必会题目终章(完结篇)

W...Y的主页 😊

代码仓库分享 💕

今天是分享C语言必会题目最终章,全部都是硬货,大家都坐好准备开始喽!!!

编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行 表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次

例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3 。

数据范围: 0 <= n <= 500

输入描述:输入一行没有空格的字符串。

输出描述:输出 输入字符串 中范围在(0~127,包括0和127)字符的种数。

OJ链接【牛客网题号: HJ10 字符个数统计】

示例: 输入:abc 输入:aaa

            输出:3 输出:1


这道题非常简单,ASCII码的范围为127,我们只需要创建一个char类型的数组进行全部初始化为0,然后将字符作为数组下标在数组中进行标记,若数组中没有标记过表示第一次出现,进行计数,否则表示重复字符。

示例:查表法, "aaa" ,首先把a字符( ascii 值为 97 )作为下标,将标记数组的第 97 位置 1 ,下次如果还有 a 字符出 现,到下标 'a' 或者 97 的位置一看是1就表示a已经统计过了,使用if进行判断即可成功。

下面为代码实现:

#include <stdio.h>int main() {char tmp[501] = {0};while(scanf("%s", tmp) != EOF){char mark[128] = {0};int count = 0;char *ptr = tmp;while(*ptr){if(mark[*ptr] != 1){count++;}mark[*ptr] = 1;ptr++;}printf("%d\n", count);}return 0;
}

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。

OJ链接【 leetcode 题号:169. 多数元素】 

示例 1:

输入:nums = [3,2,3]
输出:3

示例 2:

输入:nums = [2,2,1,1,1,2,2]
输出:2
提示:

n == nums.length 

1 <= n <= 5 * 104

进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。


解法一:

首先我们得清楚这个数组中一定会有一个元素出现次数大于等于n/2,所以当我们排序后再取中间的元素返回一定是多数元素。(只需要极少量的代码即可完成)

时间复杂度O(nlogn),空间复杂度O(1)。

#include <stdio.h>
#include<string.h>
#include<stdlib.h>int compar(const void* p1, const void* p2)
{return *(int*)p1 - *(int*)p2;
}int majorityElement(int* nums, int numsSize){qsort(nums, numsSize,sizeof(int), compar);return nums[numsSize / 2];
}

进阶解法二:

一个数组中有一个数字出现次数大于 n/2 ,从第 0 个字符开始,假设它就是最多的那个数字,遇到相同的数字则 计数 +1 , 遇到不同的则计数 -1 ,其实就是互相消耗,等到计数为 0 的时候,表示本次互拼完毕,从下一个字符重 新开始互拼,但是归根结底出现次数大于 n/2 的这个数字数量更多,因此也是最后保留的字符。

示例: "23335" 首先从字符 2 开始计数 1 ,遇到 3 ,不同则 -1 ,互拼消耗 重新从剩下的 "335" 开始的过程,这时 候保存的字符为 3 ,遇到 3 则计数 +1 , 遇到5则计数 -1 ,在计数不为 0 时,走到末尾保存的字符就是个数超过 n/2 的字符。

这种方法不容易被想到,但是优化了时间复杂度。

int majorityElement(int* nums, int numsSize){int count = 1;int tmp = nums[0];for(int i = 1; i < numsSize; i++){if(tmp == nums[i]){count++;}else{count--;}if(count == 0){tmp = nums[i+1];}}return tmp;
}

 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

数据范围:两个数都满足 0≤n≤1000

OJ链接【牛客网题号: JZ65 不用加减乘除做加法】     

进阶:空间复杂度 O(1),时间复杂度O(1)   

示例: 输入:1,2 返回值:3


十进制相加思想: 15+07 , 先计算不考虑进位的相加结果 12 (因为 5+7 的不考虑进位的结果是 2 ,遇 10 进位 嘛),然后计算进位 5+7 进位是 10 ,则 10 与 12 再次相加,得到 22 ,进位为 0 ,则计算到此结束。

这里使用二进制求和完成,思想类似,但是二进制计算相加和进位不需要使用 + 符号

二进制相加思想:与十进制相同,先计算不考虑进位的相加结果( 0+0 得 0 , 1+1 进位得 0 , 1+0 得 1 ),使用 异或可以取得; 然后计算相加的进位结果(同 1 的位置左移一位即可),使用相与后左移取得。

示例:

5   0101 + 7   0111 不考虑进位的相加结果 0101^0111 -> 0010 相加的进位 0101&0111 -> 0101 因为进位左移得到 1010

1010 + 0010 不考虑进位的相加结果 1010 ^ 0010 -> 1000 相加的进位 1010 & 0010 -> 0010 因为进位左移得到 0100

1000 + 0100 不考虑进位的相加结果 1000 ^ 0100 -> 1100 相加的进位 1000 & 0100 -> 0000 进位为0结束运算。

int Add(int num1, int num2 ) {int sum = 0;while(num2 != 0)//进位不为0则持续与相加结果进行相加{sum = num1 ^ num2;//进位不为0则持续与相加结果进行相加num2 = (num1 & num2) << 1;//同1的位相加则会进位num1 = sum;}return num1;
}

 1、给定一个二进制数组, 计算其中最大连续 1 的个数。

OJ链接【 leetcode 题号:485. 最大连续 1 的个数】

示例: 输入:[1,1,0,1,1,1] 输出:3

解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.


这道题思路比较简单,统计连续1的个数,遇到0时表示连续中断,判断如果当前的统计数大于之前最大的则替换, 然后继续下一个位置开始的统计即可。

int findMaxConsecutiveOnes(int* nums, int numsSize){int max = 0;int count = 0;for(int i = 0; i < numsSize; i++){if(nums[i] == 1){count++;if(max < count){max = count;}}else{count = 0;}}return max;
}

求输出n以内(含n)完全数的个数。完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。 它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。

例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。

注意:本题输入含有多组样例。

输入描述:输入一个数字n 输出描述:输出不超过n的完全数的个数

OJ链接【牛客网题号: HJ56 完全数计算】

示例: 输入:1000 7 100 输出:3 1 2


这道题的关键在于完全数的判断:完全数指的是一个数字的所有约数的和和自身相等。我们只需要从 1 开始将这个 数的约数相加求和即可。

约数就是能够被数字整除,而这里简化的一个思路是数字能够被整除,则除数和结果就都是约数,这种思路下,只 需要从1计算到平方根即可

比如:数字 8 , 能够整除 2 ,结果是 4 ,则除数 2 和结果 4 都是约数,而这两个只需要一次计算判断即可。

需要注意的是 4,9,25... 这种,除数和结果相同的情况,则除数或者结果只相加一次就够了。

#include <stdio.h>
#include<math.h>
int is_perfect_num(int num)
{
int sum = 1;
for (int i = 2; i <= sqrt(num); i++) {
if (num % i == 0) {//判断是否能够整除i,能整除则i和结果都是约数
sum += i; //与除数相加
if (i != sqrt(num))//防止除数和结果相同的情况下重复相加
sum += num / i; //与相除结果相加
}
}
if (sum == num) return 1;
return 0;
}
int main()
{
int n;
while(~scanf("%d", &n)){
int count = 0;
for(int i = 2; i <= n; i++) {//对n以内的数字都进行判断是否是完全数,注意1不参与判断
if (is_perfect_num(i)) count++;
}
printf("%d\n", count);
}
return 0;
}

数列的定义如下:数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。 输入描述: 输入数据有多组,每组占一行,由两个整数 n(n<10000) 和 m(m<1000) 组成,n和m的含义如前所述。

输出描述: 对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数。

OJ链接【牛客网题号: ZJ16 数列的和】 

输入:

81 4
2 2

输出:

94.73
3.41

求取一个数字的平方根可以使用数学库中的 double sqrt(double num) 函数完成,接下来只需要从数字自身开始进行 求和并在求和后将 n 自身计算成为自身的平方根即可。

#include <stdio.h>
#include<math.h>
int main() {double m, n;while(scanf("%lf %lf", &n, &m) != EOF){double sum = 0;while(m-- > 0){sum +=n;n = sqrt(n);}printf("%.2lf\n",sum);}return 0;
}

现在有一个长度为 n 的正整数序列,其中只有一种数值出现了奇数次,其他数值均出现偶数次,请你找出那个 出现奇数次的数值。

输入描述:第一行:一个整数n,表示序列的长度。第二行:n个正整数ai,两个数中间以空格隔开。

输出描述:一个数,即在序列中唯一出现奇数次的数值。

OJ链接【牛客网题号: KS33 寻找奇数】

示例: 输入:5 2 1 2 3 1 输出:3


异或:二进制比特位相同则0, 不同则1.

异或法:两个相同的数字异或得到的是0, 基于这个思路,这道题对数组中的所有数据进行逐一异或就可以解决得到奇数次 的数字,因为偶数次的数字都被异或成为0了,最后单独保留了奇数次的数字。

#include <stdio.h>int main() {int n;while(~scanf("%d", &n)){int num = 0, tmp = 0;//对每个数字进行异或,出现偶数次的就会异或为0了,而奇数次刚好剩下的就是对应数字for (int i = 0; i < n; i++){scanf("%d", &tmp);num ^= tmp;}printf("%d\n", num);}return 0;
}

给定一个长度为n的数组 nums ,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任 何一个所在位置即可。

1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于

2.假设 nums[-1] = nums[n] = 负无穷小

3.对于所有有效的 i 都有 nums[i] != nums[i + 1]

OJ链接【牛客网题号: NC107 寻找峰值】

示例: 输入:[2,4,1,2,7,8,4] 返回值:1

说明:4和8都是峰值元素,返回4的索引1或者8的索引5都可以

输入:[5,3,4,2,6] 返回值:0

说明:-1作为下标或者n下标位置都表示负无穷小, 则0号下标5是峰值,或者4号下标6也是峰值


方法一:

先将数组中首位进行特殊处理,如果满足题中要求直接返回对应下标,如果不满足条件只需要判断数组中当前元素与下一个元素大小即可,如果当前元素大于下一元素则返回当前元素下标即可,反之则继续循环。

int findPeakElement(int* nums, int numsLen ) {if (numsLen == 1 || nums[0] > nums[1]) return 0;if (nums[numsLen-1] > nums[numsLen-2]) return numsLen-1;int a = 0;for(int i = 1; i < numsLen-1; i++){if(nums[i] > nums[i+1]){a = i;break;}}return a;
}

方法二:

二分思想,中间比右边大,认为从右往左半边递增,则把 right 不断向左靠拢 right=mid ,注意不能是 mid-1 ,因为这个位置有 可能就是峰值点。

直到遇到中间比右边小了,意味着数据开始递降了,则 left 向右偏移, left=mid+1 ; 而一旦 mid+1 位置大于了 right ,意味着刚好这个 mid+1 位置,是一个左半边-右往左递降,右半边-右往左递增的点,就是一个峰值点。

示例: int arr[] = {3, 5, 4, 4, 3, 2, 1} , 这个数组中两边边界都是非峰值点

int left = 0, right = 6;

left=0,right=6,mid=3: arr[3]=4 > arr[4]=3, 则right = mid = 3; //从右往左是递增的 left=0,right=3,mid=1: arr[1]=5 > arr[2]=4, 则right = mid = 1; //从右往左是递增的 left=0,right=1,mid=0: arr[0]=3 < arr[1]=5, 则left = mid + 1 = 1; //从右往左开始递降了

left > right 退出循环, 返回left,也就是1号下标位置。

代码实现:

int findPeakElement(int* nums, int numsLen ) {if (numsLen == 1 || nums[0] > nums[1]) return 0;if (nums[numsLen-1] > nums[numsLen-2]) return numsLen-1;int left = 0, right = numsLen - 1, mid;while(left < right) {mid = left + (right - left) / 2;if (nums[mid] < nums[mid + 1])//中间比右边小,意味着右边肯定有个峰值left = mid + 1;else //否则在左边包括当前位置肯定有个峰值right = mid;}return left;
}

 以上是本次C语言必会题目,都是些非常经典的内容,希望博主的分享对你们有帮助。

你们的支持是博主最大的动力,谢谢观看!!!

相关文章:

力推C语言必会题目终章(完结篇)

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 今天是分享C语言必会题目最终章&#xff0c;全部都是硬货&#xff0c;大家都坐好准备开始喽&#xff01;&#xff01;&#xff01; 编写一个函数&#xff0c;计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内…...

CS5263替代停产IT6561连接DP转HDMI音视频转换器ASL 集睿致远CS5263设计电路原理图

ASL集睿致远CS5263是一款DP1.4到HDMI2.0b转换器芯片&#xff0c;设计用于将DP1.4源连接到HDMI2.0b接收器。 CS5263功能特性&#xff1a; DP接口包括4条主通道、辅助通道和HPD信号。接收器支持每通道5.4Gbps&#xff08;HBR2&#xff09;数据速率。DP接收机结合了HDCP1.4和HDCP…...

数据分析 | 随机森林如何确定参数空间的搜索范围

1. 随机森林超参数 极其重要的三个超参数是必须要调整的&#xff0c;一般再加上两到三个其他超参数进行优化即可。 2. 学习曲线确定n_estimators搜索范围 首先导入必要的库&#xff0c;使用sklearn自带的房价预测数据集&#xff1a; import numpy as np import pandas as pd f…...

5G+AI数字化智能工厂建设解决方案PPT

导读&#xff1a;原文《5GAI数字化智能工厂建设解决方案》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。数字化智能工厂定义 智能基础架构协同框架 - 端、边、云、网…...

Windows配置编译ffmpeg +音视频地址

Windows配置MinGW及MinGW-make使用实例 https://blog.csdn.net/Henoiiy/article/details/122550618 ffmpeg安装遇错&#xff1a;nasm/yasm not found or too old. Use --disable-x86asm for a crippled build. https://blog.csdn.net/sayyy/article/details/124337834https://…...

C语言 常用工具型API --------system()

函数名&#xff1a; system&#xff08;&#xff09; 用 法&#xff1a; int system(char *command); 原理&#xff1a; 加载一个子进程去执行指定的程序&#xff0c;而想Linux命令基本都是一个单独的进程实现的&#xff0c;所以你所掌握的Linux命令越多&#xff0c;该函数功…...

车规级半导体分类(汽车芯片介绍)

车规级半导体&#xff0c;也被称为“汽车芯片”&#xff0c;主要应用于车辆控制装置、车载监控系统和车载电子控制装置等领域。这些半导体器件主要分布在车体控制模块上&#xff0c;以及车载信息娱乐系统方面&#xff0c;包括动力传动综合控制系统、主动安全系统和高级辅助驾驶…...

opencv图像轮廓检测

效果展示&#xff1a; 代码部分&#xff1a; import cv2 import numpy as np img cv2.imread(C:/Users/ibe/Desktop/picture.PNG,cv2.IMREAD_UNCHANGED) # 类型转换 img cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 结构元 kernel cv2.getStructuringElement(cv2.MORPH_REC…...

诚迈科技荣膺小米“最佳供应商奖”

近日&#xff0c;诚迈科技受邀参加小米战略合作伙伴HBR总结会。诚迈科技以尽职尽责的合作态度、精益求精的交付质量荣膺小米公司颁发的最佳供应商奖&#xff0c;其性能测试团队荣获优秀团队奖。 诚迈科技与小米在手机终端方向一直保持着密切的合作关系&#xff0c;涉及系统框架…...

分布式 - 消息队列Kafka:Kafka 消费者的消费位移

文章目录 01. Kafka 分区位移02. Kafka 消费位移03. kafka 消费位移的作用04. Kafka 消费位移的提交05. kafka 消费位移的存储位置06. Kafka 消费位移与消费者提交的位移07. kafka 消费位移的提交时机08. Kafka 维护消费状态跟踪的方法 01. Kafka 分区位移 对于Kafka中的分区而…...

H3C QoS打标签和限速配置案例

EF&#xff1a;快速转发 AF&#xff1a;确保转发 CS&#xff1a;给各种协议用的 BE&#xff1a;默认标记(尽力而为) VSR-88-2 出口路由配置&#xff1a; [H3C]dis current-configuration version 7.1.075, ESS 8305 vlan 1 traffic classifier vlan10 operator and if-match a…...

带curl的docker镜像image

带curl的docker镜像&#xff0c;便于k8s中查找问题&#xff0c;确认容器内部是否可用。 用于测试网络的工具&#xff0c;带有curl nslookup等命令 镜像名docker.io/appropriate/curl 测试命令docker run --rm -it docker.io/appropriate/curl /bin/sh 已测试可用 用于测试网…...

Hadoop数据迁移distcp

Hadoop数据迁移distcp 准备工作 确认源集群&#xff08;a&#xff09;,目标集群&#xff08;b&#xff09;确认a集群的主节点和b集群的主节点确认两个集群的网络相通确认迁移模式&#xff08;全量迁移还是增量迁移&#xff09;&#xff0c;这里选择全量迁移 迁移文件 迁移t…...

QT-Mysql数据库图形化接口

QT sql mysqloper.h qsqlrelationaltablemodelview.h /************************************************************************* 接口描述&#xff1a;Mysql数据库图形化接口 拟制&#xff1a; 接口版本&#xff1a;V1.0 时间&#xff1a;20230727 说明&#xff1a;支…...

LeetCode150道面试经典题-- 合并两个有序链表(简单)

1.题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 2.示例 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输…...

GitHub 如何部署写好的H5静态页面

感谢粉皮zu的私信&#xff0c;又有素材写笔记了。(●’◡’●) 刚好记录一下我示例代码的GitHub部署配置&#xff0c;以便于后期追加仓库。 效果 环境 gitwin 步骤 第一步 新建仓库 第二步 拉取代码 将仓库clone到本地 git clone 地址第三步 部署文件 新建.github\workflo…...

SharkTeam:Worldcoin运营数据及业务安全分析

Worldcoin的白皮书中声明&#xff0c;Worldcoin旨在构建一个连接全球人类的新型数字经济系统&#xff0c;由OpenAI创始人Sam Altman于2020年发起。通过区块链技术在Web3世界中实现更加公平、开放和包容的经济体系&#xff0c;并将所有权赋予每个人。并且希望让全世界每一个人都…...

C语言编程练习

考点&#xff1a;【字符串】【数组】 题目1. 打印X 题目描述 输入一个正整数N&#xff0c; 你需要按样例的方式返回一个字符串列表。 1≤N≤15。 样例 1&#xff1a; 输入&#xff1a;1 输出&#xff1a;[“X”] X样例 2&#xff1a; 输入&#xff1a;2 [“XX”, “XX”] …...

vue入门(增查改!)

<template><div><!-- 搜索栏 --><el-card id"search"><el-row><el-col :span"20"><el-input v-model"searchModel.name" placeholder"根据名字查询"></el-input><el-input v-mode…...

移动端身份证识别技术的应用,告别手动录入证件信息

随着移动互联网的的发展&#xff0c;越来越多的公司都推出了自己的移动APP&#xff0c;这些APP多数都涉及到个人身份证信息的输入认证&#xff08;即实名认证&#xff09;&#xff0c;如果手动去输入身份证号码和姓名&#xff0c;速度非常慢&#xff0c;且用户体验非常差。为了…...

网络通信原理TCP字段解析(第四十七课)

字段含义Source Port(源端口号)源端口,标识哪...

uniapp微信小程序消息订阅快速上手

一、微信公众平台小程序开通消息订阅并设置模板 这边的模板id和详细内容后续前后端需要使用 二、uniapp前端 需要是一个button触发 js&#xff1a; wx.getSetting({success(res){console.log(res)if(res.authSetting[scope.subscribeMessage]){// 业务逻辑}else{uni.request…...

MySQL 根据多字段查询重复数据

MySQL 根据多字段查询重复数据 在实际的数据库应用中&#xff0c;我们经常需要根据多个字段来查询重复的数据。MySQL 提供了一些方法来实现这个功能&#xff0c;让我们能够快速准确地找到和处理重复数据。本文将介绍如何使用 MySQL 来根据多字段查询重复数据&#xff0c;并提供…...

Markdown编辑器 Mac版Typora功能介绍

Typora mac是一款跨平台的Markdown编辑器&#xff0c;支持Windows、MacOS和Linux操作系统。它具有实时预览功能&#xff0c;能够自动将Markdown文本转换为漂亮的排版效果&#xff0c;让用户专注于写作内容而不必关心格式调整。 Typora Mac版除了支持常见的Markdown语法外&#…...

el-form自定义校验规则

Vue 的 el-form 组件可以使用自定义校验规则进行表单验证。自定义校验规则可以通过传递一个函数来实现&#xff0c;该函数接受要校验的字段的值作为参数&#xff0c;并返回一个布尔值或一个 Promise 对象。 下面是一个示例&#xff0c;演示如何在 el-form 中使用自定义校验规则…...

xml对象与字符串互换

很多老系统&#xff0c;特别是C的系统&#xff0c;可能数据结构采用的xml。xml对java来说没有什么&#xff0c;但是C来说&#xff0c;可能还有个顺序问题&#xff0c;毕竟c没有那么多通用类库。 2 xstream 先说依赖&#xff0c;我本来不想升级&#xff0c;但是有个问题卡者就给…...

单例模式和多例模式和工厂模式

1单例设计模式 学习目标 能够使用单例设计模式设计代码 内容讲解 正常情况下一个类可以创建多个对象 public static void main(String[] args) {// 正常情况下一个类可以创建多个对象Person p1 new Person();Person p2 new Person();Person p3 new Person(); }如果说有…...

【网络架构】华为hw交换机网络高可用网络架构拓扑图以及配置

一、网络拓扑 1.网络架构 核心层:接入网络----路由器 汇聚层:vlan间通信 创建vlan ---什么是vlan:虚拟局域网,在大型平面网络中,为了实现广播控制引入了vlan,可以根据功能或者部门等创建vlan,再把相关的端口加入到vlan.为了实现不用交换机上的相同vlan通信,需要配置中继,为了…...

信也科技一面凉经

1.在项目经历里挑一个详细介绍一下 项目的应用场景 2.项目里用到多线程是怎么用的&#xff1f;回答&#xff1a;线程池 用通过 ThreadPoolExecutor 构造函数的方式创建的线程池 3.线程池有哪些重要参数&#xff1f;回答&#xff1a;核心线程数、最大线程数、阻塞队列类型、…...

AI商业化如何落地?看设计师如何利用AI细化工作流

自从AI爆火之后&#xff0c;人类是否会被AI取代一直都是打工人格外关注的问题。 而最近&#xff0c;在小编深入探索到我们用户的使用情况后&#xff0c;发现已经有人拿神采PromeAI直接实现了商业应用&#xff0c;将AI的设计创意应用得淋漓尽致&#xff0c;并且直接进军房地产及…...