1.反转链表.
原理图:
/**
* 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) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* prev = nullptr;
ListNode* curr = head;
while(curr!=nullptr){
ListNode *temp = curr->next;
curr->next = prev;
prev = curr;
curr = temp;
}
return prev;
}
};
2.数组中第k个最大元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
class Solution {
public:
int findKthLargest(vector<int> &nums, int k) {
sort(nums.begin(),nums.end());
return nums[nums.size()-k];
}
// void swap(vector<int>&num,int i, int j){
// int temp = num[i];
// num[i]=num[j];
// num[j]=temp;
// }
// void quicksort(vector<int>&num,int low,int high){
// if(high <= low) return;
// int i = low;
// int j = high;
// int key = num[low];
// while(i<j){
// while(i < j && num[j] >= key){
// j--;
// }
// swap(num,i,j);
// while(i < j && num[i] <= key){
// i++;
// }
// swap(num,i,j);
// }
// num[i]= key;
// quicksort(num,low,j-1);
// quicksort(num,j+1,high);
// }
};
这里本来是写个sort就完事,不过这里的数据结构是vector,和数组有点不一样,感觉java下的好写一点?数组下:sort(arr,arr+arr.length()).vector则是上面的写法。sort排序比快排好,因为它会根据情况调用不同的排序方法,快排nlogn.
关于sort源码可以参考以下博客:参考博客1
3.无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串的长度。
// class Solution {
// public:
// int lengthOfLongestSubstring(string s) {
// int l = 0, r = 0;
// int maxlen = 0;
// for( ; r < s.size(); r++ ) {
// for( int k = l; k < r; k++ ) // 检查新元素是否在窗口内出现过
// if( s[r] == s[k] ) { // s[r]为新元素
// l = k+1;
// break; // 重新设置左边界后,就可以检查下一个新元素了
// }
// if(r-l+1 > maxlen)
// maxlen = r-l+1;
// }
// return maxlen;
// }
// };
滑动窗口,右边移动跟左边比较,如果不重复就继续,重复的话要把左边往右边移动再判断一下。