classSolution:deftwoSum(self, nums: List[int], target:int)-> List[int]:
hashtable =dict()for i, num inenumerate(nums):if target - num in hashtable:return[hashtable[target - num], i]
hashtable[nums[i]]= i
return[]
functwoSum(nums []int, target int)[]int{
hashTable :=map[int]int{}for i, x :=range nums {if p, ok := hashTable[target-x]; ok {return[]int{p, i}}
hashTable[x]= i
}returnnil}
第二题:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/classSolution{public:
ListNode*addTwoNumbers(ListNode* l1, ListNode* l2){auto dummy =newListNode(-1), cur = dummy;int t =0;while(l1 || l2 || t){if(l1) t += l1->val, l1 = l1->next;if(l2) t += l2->val, l2 = l2->next;
cur = cur->next =newListNode(t %10);
t /=10;}return dummy->next;}};
classSolution{public:intlengthOfLongestSubstring(string s){
unordered_map<char,int> heap;int res =0;for(int i =0, j =0; i < s.size(); i ++){
heap[s[i]]++;while(heap[s[i]]>1) heap[s[j ++]]--;
res =max(res, i - j +1);}return res;}};
classSolution{publicintlengthOfLongestSubstring(String s){// 哈希集合,记录每个字符是否出现过
Set<Character> occ =newHashSet<Character>();int n = s.length();// 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动int rk =-1, ans =0;for(int i =0; i < n;++i){if(i !=0){// 左指针向右移动一格,移除一个字符
occ.remove(s.charAt(i -1));}while(rk +1< n &&!occ.contains(s.charAt(rk +1))){// 不断地移动右指针
occ.add(s.charAt(rk +1));++rk;}// 第 i 到 rk 个字符是一个极长的无重复字符子串
ans = Math.max(ans, rk - i +1);}return ans;}}
classSolution:deflengthOfLongestSubstring(self, s:str)->int:# 哈希集合,记录每个字符是否出现过
occ =set()
n =len(s)# 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
rk, ans =-1,0for i inrange(n):if i !=0:# 左指针向右移动一格,移除一个字符
occ.remove(s[i -1])while rk +1< n and s[rk +1]notin occ:# 不断地移动右指针
occ.add(s[rk +1])
rk +=1# 第 i 到 rk 个字符是一个极长的无重复字符子串
ans =max(ans, rk - i +1)return ans
varlengthOfLongestSubstring=function(s){// 哈希集合,记录每个字符是否出现过const occ =newSet();const n = s.length;// 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动let rk =-1, ans =0;for(let i =0; i < n;++i){if(i !=0){// 左指针向右移动一格,移除一个字符
occ.delete(s.charAt(i -1));}while(rk +1< n &&!occ.has(s.charAt(rk +1))){// 不断地移动右指针
occ.add(s.charAt(rk +1));++rk;}// 第 i 到 rk 个字符是一个极长的无重复字符子串
ans = Math.max(ans, rk - i +1);}return ans;};
funclengthOfLongestSubstring(s string)int{// 哈希集合,记录每个字符是否出现过
m :=map[byte]int{}
n :=len(s)// 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
rk, ans :=-1,0for i :=0; i < n; i++{if i !=0{// 左指针向右移动一格,移除一个字符delete(m, s[i-1])}for rk +1< n && m[s[rk+1]]==0{// 不断地移动右指针
m[s[rk+1]]++
rk++}// 第 i 到 rk 个字符是一个极长的无重复字符子串
ans =max(ans, rk - i +1)}return ans
}funcmax(x, y int)int{if x < y {return y
}return x
}
第四题:
classSolution{public:doublefindMedianSortedArrays(vector<int>& nums1, vector<int>& nums2){int tot = nums1.size()+ nums2.size();if(tot %2==0){int left =find(nums1,0, nums2,0, tot /2);int right =find(nums1,0, nums2,0, tot /2+1);return(left + right)/2.0;}else{returnfind(nums1,0, nums2,0, tot /2+1);}}intfind(vector<int>& nums1,int i, vector<int>& nums2,int j,int k){if(nums1.size()- i > nums2.size()- j)returnfind(nums2, j, nums1, i, k);if(k ==1){if(nums1.size()== i)return nums2[j];elsereturnmin(nums1[i], nums2[j]);}if(nums1.size()== i)return nums2[j + k -1];int si =min((int)nums1.size(), i + k /2), sj = j + k - k /2;if(nums1[si -1]> nums2[sj -1])returnfind(nums1, i, nums2, sj, k -(sj - j));elsereturnfind(nums1, si, nums2, j, k -(si - i));}};
classSolution:deffindMedianSortedArrays(self, nums1: List[int], nums2: List[int])->float:defgetKthElement(k):"""
- 主要思路:要找到第 k (k>1) 小的元素,那么就取 pivot1 = nums1[k/2-1] 和 pivot2 = nums2[k/2-1] 进行比较
- 这里的 "/" 表示整除
- nums1 中小于等于 pivot1 的元素有 nums1[0 .. k/2-2] 共计 k/2-1 个
- nums2 中小于等于 pivot2 的元素有 nums2[0 .. k/2-2] 共计 k/2-1 个
- 取 pivot = min(pivot1, pivot2),两个数组中小于等于 pivot 的元素共计不会超过 (k/2-1) + (k/2-1) <= k-2 个
- 这样 pivot 本身最大也只能是第 k-1 小的元素
- 如果 pivot = pivot1,那么 nums1[0 .. k/2-1] 都不可能是第 k 小的元素。把这些元素全部 "删除",剩下的作为新的 nums1 数组
- 如果 pivot = pivot2,那么 nums2[0 .. k/2-1] 都不可能是第 k 小的元素。把这些元素全部 "删除",剩下的作为新的 nums2 数组
- 由于我们 "删除" 了一些元素(这些元素都比第 k 小的元素要小),因此需要修改 k 的值,减去删除的数的个数
"""
index1, index2 =0,0whileTrue:# 特殊情况if index1 == m:return nums2[index2 + k -1]if index2 == n:return nums1[index1 + k -1]if k ==1:returnmin(nums1[index1], nums2[index2])# 正常情况
newIndex1 =min(index1 + k //2-1, m -1)
newIndex2 =min(index2 + k //2-1, n -1)
pivot1, pivot2 = nums1[newIndex1], nums2[newIndex2]if pivot1 <= pivot2:
k -= newIndex1 - index1 +1
index1 = newIndex1 +1else:
k -= newIndex2 - index2 +1
index2 = newIndex2 +1
m, n =len(nums1),len(nums2)
totalLength = m + n
if totalLength %2==1:return getKthElement((totalLength +1)//2)else:return(getKthElement(totalLength //2)+ getKthElement(totalLength //2+1))/2
funcfindMedianSortedArrays(nums1 []int, nums2 []int)float64{
totalLength :=len(nums1)+len(nums2)if totalLength%2==1{
midIndex := totalLength/2returnfloat64(getKthElement(nums1, nums2, midIndex +1))}else{
midIndex1, midIndex2 := totalLength/2-1, totalLength/2returnfloat64(getKthElement(nums1, nums2, midIndex1 +1)+getKthElement(nums1, nums2, midIndex2 +1))/2.0}return0}funcgetKthElement(nums1, nums2 []int, k int)int{
index1, index2 :=0,0for{if index1 ==len(nums1){return nums2[index2 + k -1]}if index2 ==len(nums2){return nums1[index1 + k -1]}if k ==1{returnmin(nums1[index1], nums2[index2])}
half := k/2
newIndex1 :=min(index1 + half,len(nums1))-1
newIndex2 :=min(index2 + half,len(nums2))-1
pivot1, pivot2 := nums1[newIndex1], nums2[newIndex2]if pivot1 <= pivot2 {
k -=(newIndex1 - index1 +1)
index1 = newIndex1 +1}else{
k -=(newIndex2 - index2 +1)
index2 = newIndex2 +1}}return0}funcmin(x, y int)int{if x < y {return x
}return y
}
第五题:
classSolution{public:
string longestPalindrome(string s){
string res;for(int i =0; i < s.size(); i ++){int l = i -1, r = i +1;while(l >=0&& r < s.size()&& s[l]== s[r]) l --, r ++;if(res.size()< r - l -1) res = s.substr(l +1, r - l -1);
l = i, r = i +1;while(l >=0&& r < s.size()&& s[l]== s[r]) l --, r ++;if(res.size()< r - l -1) res = s.substr(l +1, r - l -1);}return res;}};
classSolution{public String longestPalindrome(String s){int n = s.length();boolean[][] dp =newboolean[n][n];
String ans ="";for(int l =0; l < n;++l){for(int i =0; i + l < n;++i){int j = i + l;if(l ==0){
dp[i][j]=true;}elseif(l ==1){
dp[i][j]=(s.charAt(i)== s.charAt(j));}else{
dp[i][j]=(s.charAt(i)== s.charAt(j)&& dp[i +1][j -1]);}if(dp[i][j]&& l +1> ans.length()){
ans = s.substring(i, i + l +1);}}}return ans;}}
classSolution:deflongestPalindrome(self, s:str)->str:
n =len(s)
dp =[[False]* n for _ inrange(n)]
ans =""# 枚举子串的长度 l+1for l inrange(n):# 枚举子串的起始位置 i,这样可以通过 j=i+l 得到子串的结束位置for i inrange(n):
j = i + l
if j >=len(s):breakif l ==0:
dp[i][j]=Trueelif l ==1:
dp[i][j]=(s[i]== s[j])else:
dp[i][j]=(dp[i +1][j -1]and s[i]== s[j])if dp[i][j]and l +1>len(ans):
ans = s[i:j+1]return ans
funclongestPalindrome(s string)string{
n :=len(s)
ans :=""
dp :=make([][]int, n)for i :=0; i < n; i++{
dp[i]=make([]int, n)}for l :=0; l < n; l++{for i :=0; i + l < n; i++{
j := i + l
if l ==0{
dp[i][j]=1}elseif l ==1{if s[i]== s[j]{
dp[i][j]=1}}else{if s[i]== s[j]{
dp[i][j]= dp[i+1][j-1]}}if dp[i][j]>0&& l +1>len(ans){
ans = s[i:i+l+1]}}}return ans
}
第六题:
classSolution{public:
string convert(string s,int n){
string res;if(n ==1)return s;for(int i =0; i < n; i ++){if(i ==0|| i == n -1){for(int j = i; j < s.size(); j +=2* n -2)
res += s[j];}else{for(int j = i, k =2* n -2- i; j < s.size()|| k < s.size(); j +=2* n -2, k +=2* n -2){if(j < s.size()) res += s[j];if(k < s.size()) res += s[k];}}}return res;}};
funcconvert(s string, numRows int)string{if numRows ==1||len(s)<= numRows{return s
}
groupLen := numRows*2-2var ansString []bytefor i :=0; i < numRows; i++{//计算第 i 行字符串
left := i
right := groupLen - left
for{if left >=len(s){break}
ansString =append(ansString, s[left])
left += groupLen
if i !=0&& i != numRows-1{if right >=len(s){break}
ansString =append(ansString, s[right])
right += groupLen
}}}returnstring(ansString)}
classSolution:defconvert(self, s:str, numRows:int)->str:if numRows <2:return s
res =[""for _ inrange(numRows)]
i, flag =0,-1for c in s:
res[i]+= c
if i ==0or i == numRows -1: flag =-flag
i += flag
return"".join(res)
第七题:
classSolution{public:intreverse(int x){int r =0;while(x){if(r >0&& r >(INT_MAX - x %10)/10)return0;if(r <0&& r <(INT_MIN - x %10)/10)return0;
r = r *10+ x %10;
x /=10;}return r;}};
classSolution{publicintreverse(int x){int rev =0;while(x !=0){int pop = x %10;
x /=10;if(rev > Integer.MAX_VALUE/10||(rev == Integer.MAX_VALUE /10&& pop >7))return0;if(rev < Integer.MIN_VALUE/10||(rev == Integer.MIN_VALUE /10&& pop <-8))return0;
rev = rev *10+ pop;}return rev;}}
funcreverse(x int)int{var res intfor x !=0{if temp :=int32(res);(temp*10)/10!= temp {return0}
res = res*10+ x%10
x = x /10}return res;}
defreverse_better(
self,
x:int)->int:
y, res =abs(x),0# 则其数值范围为 [−2^31, 2^31 − 1]
boundry =(1<<31)-1if x>0else1<<31while y !=0:
res = res*10+y%10if res > boundry :return0
y //=10return res if x >0else-res