242.有效的字母异位词
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。
注意:若 s
和 t
中每个字符出现的次数都相同,则称 s
和 t
互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram" 输出: true
示例 2:
输入: s = "rat", t = "car" 输出: false
提示:
1 <= s.length, t.length <= 5 * 104
s
和t
仅包含小写字母
题解:
bool isAnagram(char* s, char* t) {
if(strlen(s)!=strlen(t)){
return false;
}
int record[26];
for(int j=0;j<26;j++){
record[j]=0;
}
int x;
int y;
for(int i=0;i<strlen(s);i++){
x=s[i]-'a';
record[x]++;
}
for(int k=0;k<strlen(t);k++){
y=t[k]-'a';
record[y]--;
}
for(int m=0;m<26;m++){
if(record[m]!=0){
return false;
}
}
return true;
}
思路:哈希表中利用数组求解,首先判断两个字符串的长度,若不相同则直接返回false。根据题设条件给出了仅包含小写字母的条件,可以利用一个长度为26的数组记录每个字母出现的次数,首先遍历s数组,将相应位置的数值+1记录s字符串中每个数字出现的频次,在遍历t字符串时将对应位置的数值-1,若哈希表最终能回到全0的状态则返回true,否则返回false。
笔记: C语言中表示字符串的长度使用strlen()函数。 不必记得a的ASCLL码值,直接减去'a'即可。
349.两个数组的交集
给定两个数组 nums1
和 nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4] 解释:[4,9] 也是可通过的
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
题解:
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
int record[1000];
int m=0;
int lessSize=nums1Size>nums2Size?nums2Size:nums1Size;
int* result=(int*)malloc(lessSize*sizeof(int));
for(int j=0;j<1000;j++){
record[j]=0;
}
for(int i=0;i<nums1Size;i++){
record[nums1[i]]++;
}
for(int k=0;k<nums2Size;k++){
if(record[nums2[k]]!=0){
result[m]=nums2[k];
m++;
record[nums2[k]]=0;
}
}
*returnSize=m;
return result;
}
思路:题设给出了数值小于1000的提示,所以依然可以用哈希表来解决,定义一个长度为1000的哈希表,在定义一个存放结果的动态数组,长度取两个数组长度的最小值,先遍历nums1数组,将其出现过的数值作为结果数组的下标,使对应结果数组单元+1,再遍历nums2数组,如果对应下标的结果数组数值不为0,则表示nums中出现过该值,将该值记录进结果数组中并且将其置为0避免重复。最后输出结果数组。