242.有效的字母异构词
题目描述
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:
输入: s = “rat”, t = “car”
输出: false
说明:
你可以假设字符串只包含小写字母。
解题方法
bool isAnagram(char * s, char * t)
{
int lens = strlen(s), lent = strlen(t);
if (lens != lent)
return false;
int res[26] = {0};
for (int i = 0; i < lens; i ++)
{
res[s[i] - 'a'] ++;
res[t[i] - 'a'] --;
}
for (int i = 0; i < 26; i ++)
{
if (res[i] != 0)
{
return false;
}
}
return true;
}
217.存在重复元素
题目描述
给定一个整数数组,判断是否存在重复元素。
如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。
示例 1:
输入: [1,2,3,1]
输出: true
示例 2:
输入: [1,2,3,4]
输出: false
示例 3:
输入: [1,1,1,3,3,4,3,2,4,2]
输出: true
解题方法
先排序,再判断相邻两个是否相等,但是我用自己写的快排会超时,最后使用qsort()这个函数解决了。
int partition_sum(int *a,int low,int high)
{
int pivot=a[low];
while(low<high){
while(low<high&&a[high]>=pivot)high--;
a[low]=a[high];
while(low<high&&a[low]<=pivot)low++;
a[high]=a[low];
}
a[low]=pivot;
return low;
}
void quickSort_sum(int *a,int low,int high)
{
if(low<high){
int pivotpos=partition_sum(a,low,high);
quickSort_sum(a,low,pivotpos-1);
quickSort_sum(a,pivotpos+1,high);
}
}
bool containsDuplicate(int* nums, int numsSize)
{
if (numsSize == 0 || numsSize == 1)
return false;
quickSort_sum(nums, 0, numsSize - 1); // 快排
for (int i = 0; i < numsSize - 1; i ++)
{
if (nums[i] == nums[i+1])
return true;
}
if (nums[numsSize-2] == nums[numsSize - 1])
return true;
return false;
}
后面ac的代码:
int cmpfunc(int *a,int *b)
{
return(*a - *b);
}
bool containsDuplicate(int* nums, int numsSize)
{
if(numsSize == 0 || numsSize == 1) return false;
qsort(nums,numsSize,sizeof(int),cmpfunc);
for(int i = 0;i<numsSize -1;i++)
{
if(nums[i] == nums[i+1])
{
return true;
}
}
if (nums[numsSize-2] == nums[numsSize-1])
return true;
return false;
}
218.存在重复元素II
题目描述
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。
示例 1:
输入: nums = [1,2,3,1], k = 3
输出: true
示例 2:
输入: nums = [1,0,1,1], k = 1
输出: true
示例 3:
输入: nums = [1,2,3,1,2,3], k = 2
输出: false
解题方法
哈希。原本我的想法是,先哈希,用链表存储冲突元素(即数组下标),之后根据遍历所有链表,将每条链接中的元素存放在数组中,排序,再判断是否有元素之差不大于K。但是碰到越界元素不会处理了,看了题解,碰到如下方法:
bool containsNearbyDuplicate(int* nums, int numsSize, int k){
if(numsSize==0)
return false;
// if(numsSize==1)
int mark[numsSize];//Hash表
memset(mark,-1,sizeof(int)*numsSize);
int i,tmp;
for(i=0;i<numsSize;i++)
{
tmp=nums[i]%numsSize;//Hash函数
if(tmp<0)//转换为正数
tmp+=(numsSize-1);
if(mark[tmp]==-1)//没有存数
mark[tmp]=i;//存下数组下标
else//已经存数
{
while(nums[mark[tmp]]!=nums[i])//发生冲突
{
tmp++;tmp%=numsSize;
if(mark[tmp]==-1)//没有存数
mark[tmp]=i;//存下数组下标
}
//已经存过该数
if(i!=mark[tmp])
if(i-mark[tmp]<=k)//求差值
return true;
else
mark[tmp]=i;
}
}
return false;
}
参考:https://leetcode-cn.com/problems/contains-duplicate-ii/solution/chun-cjie-jue-ying-gai-shi-mu-qian-ti-jie-li-mian-/