datawhale八月组队学习(2)--LeetCode刷题
本次加入datawhale组织的八月份组队学习,选择了力扣刷题的小组,刷点题目,让自己的脑子不那么僵化
力扣链接https://leetcode-cn.com/
35.搜索插入位置
非常简单的查找问题,给定的数组已经是排好序了的,因此直接使用二分查找。
int searchInsert(int* nums, int numsSize, int target)
{
if(numsSize==0)
return 0;
int low=0,high=numsSize-1,index=numsSize/2;
while(low<high)
{
if(target==nums[index]) return index;
if(target>nums[index]) low=index+1;
else high=index-1;
index=(high+low)/2;
}
if(target>nums[index]) return index+1;
return index;
}
202. 快乐数
简单粗暴解法
bool isHappy(int n)
{
while(n != 1)
{
int ans = 0;
while(n)
{
ans += pow(n % 10 , 2);
n /= 10;
}
if(ans == 4)
return false;
n = ans;
}
return true;
}
205.同构字符串
没想到遇到了之前完成过的题目
bool isIsomorphic(char * s, char * t)
{
int flag=0;
int num = 0;
int x1[128] = {
0 }, x2[128] = {
0 };
for (int i = 0; s[i] != 0; i++)
{
num++;
if(x1[(int)s[i]]==0)
x1[(int)s[i] ] =num;
if (x2[(int)t[i] ] == 0)
x2[(int)t[i] ] = num;
}
for (int n = 0; s[n] != 0; n++)
{
if (x1[(int)s[n]] != x2[(int)t[n] ])
flag = 1;
}
if (flag == 1)
return false;
else
return true;
}
242.有效的字母异位词
bool isAnagram(char *s, char *t)
{
int i, x[26] = {
0 }, y[26] = {
0 };
for (i = 0; s[i] != '\0'; i++) x[s[i] - 'a']++;
for (i = 0; t[i] != '\0'; i++) y[t[i] - 'a']++;
for (i = 0; i < 26; i++)
if (x[i] != y[i]) return false;
return true;
}
- 同样是很简单的一道题目,记录字母,以及对应的数量,比较
290.单词规律
- 和字符串有关的题目,用C语言做实在是效率太低了(编写代码的效率)
class Solution(object):
def wordPattern(self, pattern, str):
"""
:type pattern: str
:type str: str
:rtype: bool
"""
s1 = str.split()
return len(s1)==len(pattern) and len(set(zip(pattern, s1))) == len(set(list(pattern))) == len(set(s1))
349. 两个数组的交集
扫描二维码关注公众号,回复:
12083147 查看本文章
- 又是一题用python写,可以很快完成的题目
class Solution(object):
def intersection(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
return list(set(nums1)&set(nums2))
350. 两个数组的交集2
- 依旧是python解题,虽然效率相比其他人相当低
class Solution(object):
def intersect(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
inter = set(nums1) & set(nums2)
l = []
for i in inter:
l += [i] * min(nums1.count(i), nums2.count(i))
return l
410. 分割数组的最大值
- 一道困难级别的题目,卑微的我又抄起了答案,答案来自评论区大佬Celia
class Solution(object):
def splitArray(self, nums, m):
"""
:type nums: List[int]
:type m: int
:rtype: int
"""
# max(nums), sum(nums)
if len(nums) == m:
return max(nums)
lo, hi = max(nums), sum(nums)
while(lo < hi):
mid = (lo + hi) // 2 # 最大和
#------以下在模拟划分子数组的过程
temp, cnt = 0, 1
for num in nums:
temp += num
# cnt += 1
if temp > mid:#说明当前这个子数组的和已经超过了允许的最大值mid,需要把当前元素放在下一个子数组里
temp = num
cnt += 1
# print temp, cnt, mid
#------以上在模拟划分子数组的过程
if cnt > m: #说明分出了比要求多的子数组,多切了几刀,说明mid应该加大,这样能使子数组的个数减少
lo = mid + 1
elif cnt <= m:
hi = mid
return lo
451. 根据字符出现频率排序
class Solution(object):
def frequencySort(self, s):
c = collections.Counter(s)
tmp = [[k, v] for k, v in c.items()]
tmp.sort(key=lambda x: x[1], reverse=True)
res = ""
for i in tmp:
res += i[0] * i[1]
return res
- python 调包解题法
540. 有序数组中的单一元素
- 暴力解题法
class Solution(object):
def singleNonDuplicate(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
return sum(set(nums))*2 - sum(nums)