26. 删除有序数组中的重复项
思路:快慢指针,快指针探路,发现与慢指针数值不同,就将慢指针前进一步,并将快指针的数值传给慢指针,快指针继续探路。流程下来相当于数组前面的内容都是无重复的。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int i=0,j=1;
while(j<nums.size()){
if(nums[i] != nums[j]){
i++;
nums[i] = nums[j];
}
j++;
}
return i+1;
}
};
83. 删除排序链表中的重复元素
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode *slow = head;
ListNode *fast = head;
while(fast){
if(slow->val != fast->val){
slow->next = fast;
slow = fast;
}
fast = fast->next;
slow->next = nullptr;
}
return head;
}
};
27. 移除元素
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow=0,fast=0;
while(fast<nums.size()){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
fast++;
}
return slow;
}
};
283. 移动零
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int slow =0,fast =0;
while(fast<nums.size()){
if(nums[fast]!=0){
nums[slow]=nums[fast];
slow++;
}
fast++;
}
while(slow<nums.size()){
nums[slow]=0;
slow++;
}
}
};
167. 两数之和 II - 输入有序数组
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int left = 0,right = numbers.size()-1,num =0;
while(right>left){
num = numbers[left]+numbers[right];
if(num == target)
break;
if(num < target)
left++;
if(num > target)
right--;
}
return vector<int>{left+1,right+1};
}
};
344. 反转字符串
class Solution {
public:
void reverseString(vector<char>& s) {
int left=0,right=s.size()-1;
char tmp;
while(left<right){
tmp = s[right];
s[right] = s[left];
s[left] = tmp;
left++;
right--;
}
}
};
5. 最长回文子串
思路:便利每个字符,计算以当前字符为回文串中心字符时,回文串的长度,保留最大长度对应的回文串,需要考虑的是回文串长度的奇偶性。
class Solution {
public:
string longestPalindrome(string s) {
string ans="";
string longest ="";
for(int i=0;i<s.length();i++){
//奇数回文串
string s1=Palindrome(s,i,i);
//偶数回文串
string s2=Palindrome(s,i,i+1);
//保留最大长度的回文串
longest = s1.length() > s2.length() ? s1 : s2;
ans =ans.length() > longest.length() ? ans : longest;
}
return ans;
}
//计算以s[left],s[right]为回文串中心时,返回回文串
string Palindrome(string s,int left,int right){
while(left>=0 && right<s.length() && s[left]==s[right]){
left--;
right++;
}
return s.substr(left+1,right-left-1);
}
};