1,242. 有效的字母异位词 - 力扣(LeetCode) (leetcode-cn.com)
bool isAnagram(char * s, char * t)
{
int lens=strlen(s);
int lent=strlen(t);
char* cnts=(char*)malloc(sizeof(char)*26);
char* cntt=(char*)malloc(sizeof(char)*26);
memset(cnts,0,sizeof(cnts));
memset(cntt,0,sizeof(cntt));
int i=0;
while(i<lens)
{
int j=s[i]-'a';
++cnts[j];
i++;
}
i=0;
while(i<lent)
{
int j=t[i]-'a';
++cntt[j];
i++;
}
for(i=0;i<26;i++)
{
if(cnts[i]!=cntt[i])
return false;
}
return true;
}
对于字符,想用计数排序的话就得减去’a‘,这里主要是没有大小写混合,不然就会更麻烦一点。如果有大小写,我目前的思路是开两个,然后判断,分别放进去或者可以看一下ASCII码,设计一下减去多少让他刚好在26之后。
2,215. 数组中的第K个最大元素 - 力扣(LeetCode) (leetcode-cn.com)
//解法一:
// int cmp(const void*e1,const void*e2)
// {
// if(*(int*)e1<=*(int*)e2)
// return 1;
// else
// return 0;
// }
// int findKthLargest(int* nums, int numsSize, int k)
// {
// qsort(nums,numsSize,sizeof(int),cmp);
// int i=0;
// for(i=0;i<numsSize;i++)
// {
// if(i+1==k)
// return nums[i];
// }
// return 0;
// }
//解法二:
int cnt[20001]={0};
int findKthLargest(int* nums, int numsSize, int k)
{
memset(cnt,0,sizeof(cnt));
int i=0;
for(i=0;i<numsSize;i++)
{
++cnt[nums[i]+10000];
}
int j=0;
for(i=0;i<20001;i++)
{
while(cnt[i]!=0)
{
if(j==numsSize)
break;
nums[j]=i-10000;
j++;
cnt[i]--;
}
}
// printf("%d",nums[]);
for(i=numsSize-1;k;k--,i--)
{
if(k-1==0)
return nums[i];
}
return 0;
}
一开始没想到怎么解决负数的问题,用qsort做了,可以看看。解法二就是计数排序了。加上一个偏移量。也就是让最小的那个负数加上它自己的绝对值之后变成0,让每个数都加上这么一个数,再统计。注意这里只是统计的时候加,原数组的数是没有变化的。然后在放回原数组的时候在减去相同的数即可。
3,268. 丢失的数字 - 力扣(LeetCode) (leetcode-cn.com)
int missingNumber(int* nums, int numsSize)
{
int* cnt=(int*)malloc(sizeof(int)*(numsSize+1));
// memset(cnt,0,sizeof(cnt));
int i=0;
for(i=0;i<numsSize+1;i++)
{
cnt[i]=0;
}
for(i=0;i<numsSize;i++)
{
++cnt[nums[i]];
}
for(i=0;i<numsSize+1;i++)
{
if(cnt[i]==0)
return i;
}
return 0;
}
这道题其实计数即可,可以不用排序。计数之后就可以找到丢失的数了。
4,389. 找不同 - 力扣(LeetCode) (leetcode-cn.com)
char findTheDifference(char * s, char * t)
{
int i=0;
int lens=strlen(s);
int lent=strlen(t);
for(i=0;i<lens;i++)
{
int j=0;
for(j=0;j<lent;j++)
{
if(s[i]==t[j])
{
t[j]='0';
break;
}
}
}
for(i=0;i<lent;i++)
{
if(t[i]!='0')
return t[i];
}
return 0;
}
可以这样,把找得到的每个元素改掉,最后找出没改的元素,可以用计数排序
int cnt[1001]={0};
char findTheDifference(char * s, char * t)
{
memset(cnt,0,sizeof(cnt));
int i=0;
int lens=strlen(s);
int lent=strlen(t);
for(i=0;i<lent;i++)
{
int j=t[i]-'a';
++cnt[j];
}
for(i=0;i<lens;i++)
{
int j=s[i]-'a';
--cnt[j];
}
for(i=0;i<1001;i++)
{
if(cnt[i]!=0)
return i+'a';
}
return 0;
}
这种方法的运行速度会快上很多。
5,645. 错误的集合 - 力扣(LeetCode) (leetcode-cn.com)
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* findErrorNums(int* nums, int numsSize, int* returnSize)
{
int* ret=(int*)malloc(sizeof(int)*2);
int* cnt=(int*)malloc(sizeof(int)*(numsSize+1));
int i=0;
for(i=0;i<numsSize+1;i++)
{
cnt[i]=0;
}
for(i=0;i<numsSize;i++)
{
++cnt[nums[i]];
}
int a=-1,b=-1;
for(i=1;i<numsSize+1;i++)
{
if(cnt[i]==2)
a=i;
if(cnt[i]==0)
b=i;
if(a!=-1&&b!=-1)
break;
}
*returnSize=2;
ret[0]=a;
ret[1]=b;
return ret;
}
同样计数即可,之后去计数的数组中寻找值为2和0的数,返回下标即可。