目录
引言(计数法与计数数组)
唯一元素的和
找到所有数组中消失的数字
好数对的数目
检查是否所有字符出现次数相同
字符串中的第一个唯一字符
引言(计数法与计数数组) 我们经常用一个奇数元素来统计元素出现的次数
如我们统计智商超过163的有多少人,就可以用一个计数法
1 2 3 4 5 6 7 8 9 int func(int *iq, int size) { int cnt = 0 ; for (i = 0 ; i < size; ++i) { if (iq[i] > 163 ) { ++cnt; } } return cnt; }
假如我们想知道iq的分布呢,那么我们就可以使用一个计数数组,我们可以把iq的值映射到计数数组的下标,其所对应的值就是这个元素出现的次数
1 2 3 4 5 6 7 8 9 int *func (int *iq, int size, int IQMax) { int i; int *cnt = (int *)malloc ( sizeof (int ) * (IQMax+1 ) ); memset (cnt, 0 , sizeof (int ) * (IQMax+1 )); for (i = 0 ; i < size; ++i) { ++cnt[ iq[i] ]; } return cnt; }
唯一元素的和
唯一元素的和
给你一个整数数组 nums
。数组中唯一元素是那些只出现 恰好一次 的元素。
请你返回 nums
中唯一元素的 和 。
示例 1:
输入: nums = [1,2,3,2]输出: 4解释: 唯一元素为 [1,3] ,和为 4 。
示例 2:
输入: nums = [1,1,1,1,1]输出: 0解释: 没有唯一元素,和为 0 。
示例 3 :
输入: nums = [1,2,3,4,5]输出: 15解释: 唯一元素为 [1,2,3,4,5] ,和为 15 。
提示:
1 <= nums.length <= 100
1 <= nums[i] <= 100
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 int sumOfUnique(int * nums, int numsSize) {int cnt[101 ]; memset(cnt,0 ,sizeof(cnt));int i=0 ;int sum =0 ;for (i=0 ;i<numsSize;i++) { ++cnt[nums[i]]; }for (i=0 ;i<101 ;i++) { if (cnt[i]==1 ) { sum +=i; } }return sum ; }
找到所有数组中消失的数字
找到所有数组中消失的数字
给你一个含 n
个整数的数组 nums
,其中 nums[i]
在区间 [1, n]
内。请你找出所有在 [1, n]
范围内但没有出现在 nums
中的数字,并以数组的形式返回结果。
示例 1:
输入: nums = [4,3,2,7,8,2,3,1]输出: [5,6]
示例 2:
输入: nums = [1,1]输出: [2]
提示:
n == nums.length
1 <= n <= 105
1 <= nums[i] <= n
有n个元素的数组原本里面的元素应该是1到n ,我们需要找到这其中没出现的元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 int * findDisappearedNumbers(int * nums , int numsSize , int * returnSize ) {int cnt[numsSize +1 ] ; memset(cnt,0 ,sizeof(cnt));int i=0 ;for (i=0 ;i<numsSize;i++) { cnt[nums [i ] ]++; }int j=0 ;for (i=1 ;i<numsSize+1 ;i++) { if (cnt[i ] ==0 ) { j++; } }int *ret=(int *)malloc(sizeof(int )*j);int k=0 ;for (i=1 ;i<numsSize+1 ;i++) { if (cnt[i ] ==0 ) { ret[k ++ ] =i; } } *returnSize=j; return ret; }
好数对的数目
好数对的数目
给你一个整数数组 nums
。
如果一组数字 (i,j)
满足 nums[i]
== nums[j]
且 i
< j
,就可以认为这是一组 好数对 。
返回好数对的数目。
示例 1:
输入: nums = [1,2,3,1,1,3]输出: 4解释: 有 4 组好数对,分别是 (0,3), (0,4), (3,4), (2,5) ,下标从 0 开始
示例 2:
输入: nums = [1,1,1,1]输出: 6解释: 数组中的每组数字都是好数对
示例 3:
输入: nums = [1,2,3]输出: 0
提示:
1 <= nums.length <= 100
1 <= nums[i] <= 100
假如一个元素出现3次,他的对数是3,加个元素出现4次,他的对数是6 ,那么我们就可以用一个计数数组来接收,假如他计数数组的值大于1,那么他的对数就是Cn2,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 int consist(int n,int m)//计数这个大于1 的数的对数 { int sum1=1 ; int sum2=1 ; int sum;int i=n;int j=1 ;for (j=1 ;j<=m;j++) { sum1*=j; }while (m { sum2*=i; i } sum=sum2/sum1;return sum; }int numIdenticalPairs(int * nums, int numsSize) { int n=numsSize;int cnt[101 ]; memset(cnt,0 ,sizeof(cnt));int i=0 ;for (i=0 ;i<n;i++) { ++cnt[nums[i]]; }int flag=1 ;int sum=0 ;for (i=1 ;i<101 ;i++) { if (cnt[i]!=0 &&cnt[i]!=1 ) { sum+=consist(cnt[i],2 ); } }return sum; }
检查是否所有字符出现次数相同
检查是否所有字符出现次数相同
给你一个字符串 s
,如果 s
是一个 好 字符串,请你返回 true
,否则请返回 false
。
如果 s
中出现过的 所有 字符的出现次数 相同 ,那么我们称字符串 s
是 好 字符串。
示例 1:
输入: s = “abacbc”输出: true解释: s 中出现过的字符为 ‘a’,’b’ 和 ‘c’ 。s 中所有字符均出现 2 次。
示例 2:
输入: s = “aaabb”输出: false解释: s 中出现过的字符为 ‘a’ 和 ‘b’ 。 ‘a’ 出现了 3 次,’b’ 出现了 2 次,两者出现次数不同。
提示:
1 <= s.length <= 1000
s
只包含小写英文字母。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 bool areOccurrencesEqual (char * s) {int cnt[26 ];memset (cnt,0 ,sizeof (cnt));int len=strlen (s);int i=0 ;for (i=0 ;i<len;i++) { ++cnt[s[i]-'a' ]; }int flag=1 ;for (i=0 ;i<len-1 ;i++) { if (cnt[s[i]-'a' ]!=cnt[s[i+1 ]-'a' ]) { return false ; } }return true ; }
字符串中的第一个唯一字符
字符串中的第一个唯一字符
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
示例:
s = “leetcode” 返回 0
s = “loveleetcode” 返回 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 int firstUniqChar(char * s) { int len=strlen (s)int cnt [26 ]memset (cnt ,0 ,sizeof(cnt ))int i=0 for (i=0 { ++cnt [s[i]-'a' ] }for (i=0 { if (cnt [s[i]-'a' ]==1 ) { return i } }return -1 }