Day05: 计数法(C语言)
前言
如果你想学好算法和数据结构,请跟随他的脚步:
英雄哪里出来.
大家一起学习,一起打卡,一起成长。
目录
- 模板
- 题目列表
- 1748.唯一元素的和
- 387.字符串中的第一个唯一字符
- 1941. 检查是否所有字符出现次数相同
- 448. 找到所有数组中消失的数字
- 1512. 好数对的数目
- 1711. 大餐计数
模板
如果题目是有关次数的问题,例如查找出只出现多少次的数字或字符,就可以用这个方法。
#define CAPACITY 100 //题目给出的最大范围
void FindValue(int* nums, int numsSize)
{if (NULL == nums) //1return;int map[CAPACITY] = { 0 }; //2//3for (int i = 0; i < numsSize; ++i){map[nums[i]]++;}//4 解决方案(题目要求)}
- 判空
- 申请一个用来计数的数组,范围太大可以动态申请
- 遍历一遍,主要是统计次数
接下来的几个题目,基本都是按照这个方式来做的
题目列表
1748.唯一元素的和
链接: 唯一元素的和
#define CAPACITY 101
int sumOfUnique(int* nums, int numsSize)
{if (NULL == nums) //1判空return 0;//2.根据题意给出的范围,申请一个计数的数组//并初始化为0int count[CAPACITY] = {0};int ans = 0;//3.计数for (int i = 0; i < numsSize; ++i){count[nums[i]]++;}//4.据题目要求写方案for (int i = 0; i < CAPACITY; ++i){if (count[i] == 1){ans += i;}}return ans;
}
387.字符串中的第一个唯一字符
链接: 字符串中的第一个唯一字符
#define CAPACITY 27
int firstUniqChar(char * s)
{//和上面的解题步骤一样if (NULL == s) //1return -1;int nums[CAPACITY] = {0}; //2int len = strlen(s);for (int i = 0; i < len; ++i) //3{nums[s[i] - 'a']++;}for (int i = 0; i < len; ++i) //4{if (nums[s[i] - 'a'] == 1){return i;}}return -1;
}
1941. 检查是否所有字符出现次数相同
链接: 1941. 检查是否所有字符出现次数相同.
#define CAPACITY 26
bool areOccurrencesEqual(char * s)
{if (NULL == s)return false;int map[CAPACITY] = {0};int count = 0;for (int i = 0; i < strlen(s); ++i){map[s[i] - 'a']++;}for (int i = 0; i < CAPACITY; ++i){if (map[i] != 0 && map[i] != map[s[0] - 'a']){return false;}}return true;
}
448. 找到所有数组中消失的数字
链接: 448. 找到所有数组中消失的数字.
这个题比较特殊,第一是范围较大,可以采用动态申请空间,第二是要返回一个数组,申请动态数组,并根据题目要求返回这个数组的大小
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize)
{*returnSize = 0;if (NULL == nums)return NULL;//申请动态空间int* map = (int*)malloc(sizeof(int) * (numsSize + 1));memset(map, 0, sizeof(int) * (numsSize + 1));//申请要返回的空间int* ans = (int*)malloc(sizeof(int) * (numsSize + 1));for (int i = 0; i < numsSize; ++i){map[nums[i]]++;}for (int i = 1; i < numsSize + 1; ++i){if (map[i] == 0){ans[(*returnSize)++] = i;}}free(map);return ans;
}
1512. 好数对的数目
链接: 1512. 好数对的数目
暴力法
双重循环,根据题目要求来记数
int numIdenticalPairs(int* nums, int numsSize)
{if (nums == NULL)return -1;int count = 0;for (int i = 0; i < numsSize - 1; ++i){for (int j = i + 1; j < numsSize; ++j){if (nums[i] == nums[j]){count++;}}}return count;
}
哈希表
#define CAPACITY 101
int numIdenticalPairs(int* nums, int numsSize)
{int map[CAPACITY] = {0};int ans = 0;for(int i = 0; i < numsSize; i++){map[nums[i]]++;ans += map[nums[i]] - 1;}return ans;
}
1711. 大餐计数
链接: 1711. 大餐计数
大餐 是指 恰好包含两道不同餐品 的一餐,其美味程度之和等于 2 的幂。
题目示例:
输入:deliciousness = [1,3,5,7,9]
输出:4
解释:大餐的美味程度组合为 (1,3) 、(1,7) 、(3,5) 和 (7,9) 。
它们各自的美味程度之和分别为 4 、8 、8 和 16 ,都是 2 的幂。
范围:
题目说出,两道不同餐品组合是2的幂,那反过来想,对每个元素,枚举出它和另一个数的所有和sum,即所有2的幂。那另一个数就是等于
other = sum - num
int map[(1<<21) + 1]; //根据题目要求写范围
int countPairs(int* deliciousness, int deliciousnessSize)
{if (NULL == deliciousness)return 0;memset (map, 0, sizeof(map)); int sum = 0; //用来保存2的幂int ans = 0; //返回的答案for(int i = 0; i < deliciousnessSize; ++i){ for(sum = 1; sum <= (1<<21); sum *= 2){ int other = sum - deliciousness[i]; if (other < 0){ continue;}ans += map[other]; ans %= 1000000007;}map[deliciousness[i]]++; }return ans;
}
方法来源
个人感觉这个方法比官方答案更好理解
链接: 英雄哪里出来《算法零基础100讲》.
Day05: 计数法(C语言)相关推荐
- PTA 1024 科学计数法 (c语言)
1024 科学计数法 (20 分) 代码如下 #include<string.h> int main(void) {char head,a[10001]= {0};int ex=0;sca ...
- PAT乙级-1024 科学计数法- C语言实现(31行AC)
考察知识点归纳: 根据题目要求输出 坑点归纳: 1.若小数部分长度等于指数值时不用在末尾加'.' 2.虽然题目说指数可能为0,实际给出指数都不为0 #include<stdio.h> in ...
- R语言禁止数值表示为科学计数法实战(Turn Off Scientific Notation ):全局设置或者单变量设置
R语言禁止数值表示为科学计数法实战(Turn Off Scientific Notation ):全局设置或者单变量设置 目录
- R语言ggplot2可视化包抑制数据轴使用科学计数法实战
R语言ggplot2可视化包抑制数据轴使用科学计数法实战 目录 R语言ggplot2可视化包抑制数据轴使用科学计数法实战
- c语言科学计数法_C入门:C语言中数据的储存(上)
How Data is stored in computer memory? 储存数据是计算机进行各种数据操作的基础,为了理解计算机可以对哪些数据进行怎样的操作,有必要了解数据在计算机中的储存方式. ...
- PTA(Basic Level) 1024:科学计数法 (C语言实现)
PTA(Basic Level) 1024:科学计数法 (C语言实现) 学习:正则表达式输入%[0-9],输入字符0-9,输入其他字符,则从此字符处被截断,如输入12345a123,则接受字符串为12 ...
- PAT乙级 C语言 1024 科学计数法
注意点:俺没有注意到个位数是1位--且可以用"%[^E]E%d"输入,要不可以省一堆压根没用的东西--但我懒得改了 我觉得这个写的很好PAT乙级1024. 科学计数法(C语言)_对 ...
- C语言实例:输出八进制,十进制,十六进制,指定位数整数,带符号整数,科学计数法表示的整数
C语言实例:输出整数的几种方式 1. 直接输出整数 直接使用printf函数输出整数即可,例如: #include <stdio.h>int main() {int num = 123;p ...
- R语言科学计数法详解:digits和scipen设置
控制R语言科学计算法显示有两个option: digitis和scipen.介绍的资料很少,而且有些是错误的.经过翻看R语言的帮助和做例子仔细琢磨,总结如下: 默认的设置是: getOption(&q ...
最新文章
- pip: failed to create process.解决方法
- 飞桨领航团邀你出战!黑客松线下48H Coding Party等你来
- react 合并数组_React 常被忽视的细节。
- 免费录屏、直播推流软件之OBS Studio
- 日志文件夹不存在或被删除
- 转:visio 2013 激活软件 -- 记录
- C++——输入、输出和文件
- 如何快速将WPS表格或者excel数据将表格转化为json
- void* 指针有什么用
- 连续状态方程离散化与凸包表示形式
- 如何推进中小学STEM教育课程开发和实施
- 【C 语言】结构体 ( 结构体深拷贝 )
- 在Excel中怎样快速对数据进行求和?分享4种求和方法
- python编程猜拳游戏_python写猜拳小游戏
- 从《C++ Primer 第四版》入手学习 C++
- 手把手教你用pytorch实现k折交叉验证,解决类别不平衡
- java基于springboot智能停车场车位管理系统附源码风格
- 计算机页面格式和编排,计算机基础教案word排版(三)页面格式设置.doc
- 监听程序异常ios_最新的移动应用程序侵犯隐私行为ios剪贴板监听
- 工业物联网·翻推机设备联网及本地组网解决方案
热门文章
- 一个从业(非正品)奢侈品十年从业者的经验和历程。
- 2018秦皇岛ccpc赛后总结
- 相册里的WEB3 Festivals香港记忆
- Git快速入门篇—— Windows版本淘宝镜像快速下载安装详细步骤及简单入门教程(附带图文教程)
- 用python的tkinter做游戏(八)—— 实现图片在tkinter中自适应大小(自动匹配窗口)
- 应用程序“Parallels Desktop“无法打开MAC电脑打不开
- 微信账户如何解除对第三方应用的授权
- -I (大写i)、-L、-l(小写L) 的使用
- aruco字典如DICT_4X4_50含义
- WIN7笔记本 用户账户登录密码忘记/错误解决方法