242.有效的字母异位词
哈希表:将要检索的目标转化成索引下标
用数组做哈希表
bool isAnagram(char * s, char * t){
int a[27] = {0};
int b[27] = {0};
for(int i = 0;i < strlen(s);i++)
{
a[s[i]-'a']++;
}
for(int i = 0;i < strlen(t);i++)
{
b[t[i]-'a']++;
}
int flag = 0;
for(int i = 0;i < 27;i++)
{
if(a[i]==b[i]) flag = flag;
else
{
flag++;
break;
}
}
return flag == 0;
}
改良:只用一个数组,现加后减,最后验证是不是全部为0
349. 两个数组的交集
先把数组1做成哈希表
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
int hash[1001] = {0};
int* re = (int*)malloc(sizeof(int)*nums2Size);
int i;
*returnSize = 0;
for(i = 0;i<nums1Size;i++)
{
hash[nums1[i]] = 1;
}
for(i = 0;i<nums2Size;i++)
{
if(hash[nums2[i]]==1)
{
re[(*returnSize)++] = nums2[i];
hash[nums2[i]] = 0;
}
}
return re;
}
关于C语言实现set稍后再说
202. 快乐数
快慢指针防环
int next_n(int n)
{
int r=0;
while(n!=0)
{
int d = n%10;
n/=10;
r +=d*d;
}
return r;
}
bool isHappy(int n){
int slow=n;
int fast=n;
do{
slow=next_n(slow);
fast=next_n(next_n(fast));
}
while(fast!=slow);
return fast==1;
}
1. 两数之和
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int i,j;
*returnSize = 2;
int* result = NULL;
for(i=0;i<numsSize-1;i++)
{
for(j=i+1;j<numsSize;j++)
{
if(nums[i]+nums[j]==target)
{
result = (int*)malloc(sizeof(int)*2);
result[0]=i;
result[1]=j;
return result;
}
}
}
return result;
}