力扣1748,387,1941,448,1512,1711题解

news/2025/3/19 23:49:59/

文章目录

    • 1748. 唯一元素的和
        • 计数法
        • 哈希表(STL)
    • 387. 字符串中的第一个唯一字符
        • 计数法统计出现次数,然后一次循环返回索引
        • 哈希表存次数
    • 1941. 检查是否所有字符出现次数相同
        • 统计每一个字符出现的次数,然后都和第一个次数比较相等与否就可以了
    • 448. 找到所有数组中消失的数字
        • 不多说,直接暴力
        • 试了一下STL发现我错了。。。还是老老实实自己写吧
        • 终极版
    • 1512. 好数对的数目
        • 计数法直接统计
    • 1711. 大餐计数
        • 枚举一个数,然后枚举2的整数幂,寻找差是否存在

1748. 唯一元素的和

题目链接

计数法

使用一个数组,记录每一个数出现的次数,第一次出现就加上,第二次出现就减去

class Solution {
public:int sumOfUnique(vector<int>& nums) {int sum=0;int cnt[110]={0};int n=nums.size();for(int i=0;i<n;i++){if(cnt[nums[i]]==0) sum+=nums[i];else if(cnt[nums[i]]==1) sum-=nums[i];cnt[nums[i]]++;}return sum;}
};

哈希表(STL)

class Solution {
public:int sumOfUnique(vector<int>& nums) {int sum=0;unordered_map<int,int>mp;for(int i=0;i<nums.size();i++) mp[nums[i]]++;for(auto t:mp){if(t.second==1) sum+=t.first;}return sum;}
};

387. 字符串中的第一个唯一字符

题目链接

计数法统计出现次数,然后一次循环返回索引

class Solution {
public:int firstUniqChar(string s) {int cnt[26]={0};int n=s.size();for(int i=0;i<n;i++){cnt[s[i]-'a']++;}for(int i=0;i<n;i++){if(cnt[s[i]-'a']==1) return i;}return -1;}
};

哈希表存次数

class Solution {
public:int firstUniqChar(string s) {unordered_map<int, int> mp;for (auto t: s) {mp[t]++;}for (int i = 0; i < s.size(); ++i){if (mp[s[i]] == 1) return i;}return -1;}
};

1941. 检查是否所有字符出现次数相同

题目链接

统计每一个字符出现的次数,然后都和第一个次数比较相等与否就可以了

class Solution {
public:bool areOccurrencesEqual(string s) {unordered_map<int,int>mp;for(auto t:s) mp[t]++;int flag=mp[s[0]];for(auto t:mp){if(t.second!=flag) return false;}return true;}
};

448. 找到所有数组中消失的数字

题目链接

不多说,直接暴力

class Solution {
public:vector<int> findDisappearedNumbers(vector<int>& nums) {vector<int>res;int n=nums.size();bool st[100010];memset(st,false,sizeof(st));for(int i=0;i<nums.size();i++) st[nums[i]]=true;for(int i=1;i<=n;i++){if(!st[i]) res.push_back(i);}return res;}
};

在这里插入图片描述
然后考虑一下时空的优化

试了一下STL发现我错了。。。还是老老实实自己写吧

class Solution {
public:vector<int> findDisappearedNumbers(vector<int>& nums) {vector<int>res;int n=nums.size();unordered_map<int,int>mp;for(int i=0;i<nums.size();i++) mp[nums[i]]=1;for(int i=1;i<=n;i++){if(mp.find(i)==mp.end()) res.push_back(i);}return res;}
};

在这里插入图片描述
最省空间的那不就是用原数组了嘛

终极版

最好的方法基本还是用哈希表吧。不使用额外数组的思路就是直接用当前数组做哈希表了。手动实现哈希表先要想一个公式,注意到(nums[i]-1)%n==(nums[i]-1+n)%n==(num[i]-1+2*n)%n==…于是我们就可以直接使用(nums[i]-1)%n作为计算索引的公式(%n保证了新索引不会越界)。我们给所有数组中有的数字的索引除都加了若干次n,如果一个位置的数字最后都小于n那他就一定不存在了

class Solution {
public:vector<int> findDisappearedNumbers(vector<int>& nums) {vector<int> res;int n = nums.size();for (int i = 0; i < n; i++) {int t = (nums[i] - 1) % n;nums[t] += n;}for (int i = 0; i < n; i++)if (nums[i] <= n) res.push_back(i + 1);return res;}
};

在这里插入图片描述

1512. 好数对的数目

题目链接

计数法直接统计

class Solution {
public:int numIdenticalPairs(vector<int>& nums) {int cnt[110]={0};int flag=0,sum=0;int n=nums.size();for(int i=0;i<n;i++){cnt[nums[i]]++;flag=max(flag,nums[i]);}for(int i=1;i<=flag;i++){sum+=(cnt[i]-1)*cnt[i]/2;}return sum;}
};

1711. 大餐计数

题目链接

枚举一个数,然后枚举2的整数幂,寻找差是否存在

class Solution {
public:int countPairs(vector<int>& deliciousness) {const int MOD=1e9+7;int cnt[(1<<21)+1]={0};int i,sum=0;int ans=0;for(i=0; i<deliciousness.size(); i++){         for(sum = 1;sum<=(1<<21); sum*=2) {   int t = sum-deliciousness[i];         if (t>=0) ans += cnt[t];                 ans%=MOD;}cnt[deliciousness[i]]++;                }return ans;   }
};

http://www.ppmy.cn/news/271983.html

相关文章

CF1512E Permutation by Sum(思维)

题目传送门 这道题是我灵光一闪突然想到的做法。 首先叙述一下题意&#xff1a; 这道题的意思就是说&#xff1a;给你四个数n,a,b,s让你构造一个长度为n的数字序列&#xff0c;这个序列的要求是数字必须是在1~n中的&#xff0c;而且不能有重复的数字&#xff0c;并且在下标a ~ …

1512 好数对的数目

题目描述&#xff1a; 给你一个整数数组 nums 。 如果一组数字 (i,j) 满足 nums[i] nums[j] 且 i < j &#xff0c;就可以认为这是一组 好数对 。 返回好数对的数目。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,1,1,3] 输出&#xff1a;4 解释&#xff1a;有 4 组…

大数据基础-Hadoop MP开发

1. MAPREDUCE原理篇&#xff08;1&#xff09; Mapreduce是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于hadoop的数据分析应用”的核心框架&#xff1b; Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff0c…

ZYNQMP_XAZU3EG_LINUX 默认启动项修改

默认启动项为 ZynqMP> print default_bootcmd default_bootcmdrun uenvboot; run cp_kernel2ram && bootm ${netstart} 由于启动vx7改动&#xff0c;需要恢复&#xff0c;做如下改动&#xff0c;恢复正常 ZynqMP> setenv bootcmd $default_bootcmd ZynqMP>…

Xilinx zynq zynqmp Macb Gem千兆网使用

作者 QQ群&#xff1a;852283276 微信&#xff1a;arm80x86 微信公众号&#xff1a;青儿创客基地 B站&#xff1a;主页 https://space.bilibili.com/208826118 参考 zynqMP GEM 如何配置GT lane Zynq MPsoc的GEM Ethernet DTS问题 2017.1-2018.3 Zynq UltraScale MPSoC: Linu…

【Arduino + Linux】基于 Helix 解码库实现 MP3 音频播放

目录 一、MP3 文件结构1.1、ID3V2.31.1.1、标签头1.1.2、扩展标签头1.1.3、标签帧 1.2、音频数据1.3、ID3V11.4、MP3文件结构图 二、MP3 解码库三、Windows上播放MP3文件3.1、伪代码分析3.2、创建项目 & 编译生成可执行文件 四、ESP32上播放MP3文件4.1、VS Code开发环境搭建…

STM32MP157学习笔记(四) ---- Debian文件系统移植

一、构建 Debian for ARM Linux 主机环境 $ uname -a Linux lodge-ubuntu 5.11.0-35-generic #37~20.04.1-Ubuntu SMP Mon Sep 13 13:30:34 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux 1、安装构建工具 sudo apt-get install binfmt-support qemu qemu-user-static debootst…

Java程序执行流程

Java程序执行的整个过程可以分为三个阶段&#xff1a;编译、加载和运行 1.编译 Java程序的源代码需要经过编译器&#xff08;例如javac&#xff09;的编译&#xff0c;将其转换成字节码&#xff08;即.class文件&#xff09;&#xff0c;这个过程称为编译。编译器会对源代码中…