题目链接:242.有效的字母异位词
数组其实就是一个简单哈希表,而且这道题目中字符串只有小写字符,那么就可以定义一个数组,来记录字符串s里字符出现的次数。定一个数组int count[26]={0},因为字符a到字符z的ASCII也是26个连续的数值。
需要把字符映射到数组也就是哈希表的索引下标上,因为字符a到字符z的ASCII是26个连续的数值,所以字符a映射为下标0,相应的字符z映射为下标25。
再遍历 字符串s的时候,只需要将 s[i] - ‘a’ 所在的元素做+1 操作即可,并不需要记住字符a的ASCII,只要求出一个相对数值就可以了(count[s[i] - ‘a’]++)。
再检查字符串t中是否出现了这些字符,同样在遍历字符串t的时候,对t中出现的字符映射哈希表索引上的数值再做-1的操作(count[t[i] - ‘a’]--)。
那么最后检查一下,count数组如果有的元素不为零0,说明字符串s和t一定是谁多了字符或者谁少了字符,return false。
最后如果record数组所有元素都为零0,说明字符串s和t是字母异位词,return true。
代码如下:
bool isAnagram(char * s, char * t){
int len_s=strlen(s),len_t=strlen(t);
int record[26] = {0};
for (int i = 0; i < len_s; i++) {
record[s[i] - 'a']++;
}
for (int i = 0; i < len_t; i++) {
record[t[i] - 'a']--;
}
for (int i = 0; i < 26; i++) {
if (record[i] != 0) {
return false;
}
}
return true;
}
题目链接:349. 两个数组的交集
这道题力扣改了 题目描述 和 后台测试数据增添了 数值范围:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
所以就可以 使用数组来做哈希表了, 因为数组都是 1000以内的。
这道题跟第242题大体上的思路没差太多,最主要的不同在于设置了两个工作数组,count[]用来寻找两个数组中的相同元素,result[]用来存放最终结果,这里有一点要特别注意:为避免在result[]中出现重复元素,在result[]添加元素时,要将count[]中对应的元素置0。
代码如下:
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
int count[1000]={0};
int lessSize=nums1Size<nums2Size?nums1Size:nums2Size;
int*result=(int*)malloc(sizeof(int)*lessSize);
int resultIndex=0;
int i;
for(i=0;i<nums1Size;i++)
{
count[nums1[i]]++;
}
for(i=0;i<nums2Size;i++)
{
if(count[nums2[i]]>0)
{
result[resultIndex++]=nums2[i];
count[nums2[i]]=0;
}
}
*returnSize=resultIndex;
return result;
}
题目链接:202. 快乐数
快乐数,有点不快乐,想了老半天也没有想出一个巧妙的思路,最终还是选择暴力破解了。
bool isHappy(int n){
for(int i = 0 ; i< 10;i++)
{
int sum=0;
while(n>0)
{
sum += (n%10)*(n%10);
n = n /10;
}
n = sum;
if(n==1)
return sum;
}
return false;
}
题目链接:1. 两数之和
这道题用c++写,可以使用很便捷的哈希法,map是一种key value的存储结构,可以用key保存数值,用value在保存数值所在的下标。
代码如下:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
std::unordered_map<int,int> result;
for(int i=0;i<nums.size();i++)
{
auto iter=result.find(target-nums[i]);
if(iter!=result.end())
return {iter->second,i};
else
result.insert(pair<int,int>{nums[i],i});
}
return {};
}
};
这道题用C语言来写,我只想到了枚举暴力法
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
for(int i=0;i<numsSize;i++)
{
for(int j=i+1;j<numsSize;j++)
{
if(nums[i]+nums[j]==target)
{
int* temp=(int*)malloc(sizeof(int)*2);
*returnSize=2;
temp[0]=i;temp[1]=j;
return temp;
}
}
}
*returnSize=0;
return NULL;
}