您的位置:首页 > 其它

双指针,前后指针法, 快排思路, leetcode

2016-06-22 09:48 363 查看


https://leetcode.com/problems/remove-element/


7. Remove Element

 

Question
Editorial Solution
 My Submissions

Total Accepted: 146310
Total Submissions: 408505
Difficulty: Easy

Given an array and a value, remove all instances of that value in place and return the new length.
Do not allocate extra space for another array, you must do this in place with constant memory.
The order of elements can be changed. It doesn't matter what you leave beyond the new length.
Example:

Given input array nums = 
[3,2,2,3]
, val = 
3

Your function should return length = 2, with the first two elements of nums being 2.
ac代码

class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int len = nums.size();

int left = 0;
int right = len - 1;

while (left <= right){
while (left < len && nums[left] != val) //找到遇到的第一个val
{
left++;
}

while (right >= 0 && nums[right] == val) // 从后往前 找到第一个不是val的
{
right--;
}
if (left > right)
{
break;
}
// swap 上面的两个位置
nums[left] = nums[right];
nums[right] = val;
}
return left;
}
};


-----

问题1: 奇偶数排序,使得奇数位于数组前半部分,偶数位于后半部分

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

bool isOddNum(int n)
{
if(n % 2 == 1)
return true;
return false;
}

/* 返回 奇偶交界的位置 */
int OddEvenSort(int a[], int left, int right)
{
if(left >= right)
return -1;
while(left < right)
{
while(isOddNum(a[left])) // 是奇数 头指针往后移动
left ++;
while(!isOddNum(a[right])) // 是偶数 尾指针往前移动
right --;
if(left < right)
{
swap(a[left] , a[right]); // a[left]为偶数, a[right]为奇数 交换
left ++;
right --;
}
}
return left;
}

int main()
{
int a[] = {2, 8, 7, 1, 3, 5, 6, 4, 11};
int n = 9;
int pos = OddEvenSort(a,  0 , n - 1);
printf("the count of Odd Number is %d\n", pos - 0);
for(int i = 0; i < n - 1 ; i++)
{
printf("%d ", a[i]);
}
printf("%d\n", a[n - 1]);
return 0;
}

问题2: 求链表的倒数第k项

题目参考:http://blog.csdn.net/qq_26437925/article/details/49488049

#include <cstdio>
#include <sstream>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <algorithm>

using namespace std;

typedef struct node
{
int data;
struct node *next;
}lnode;

lnode *create_node(int data)
{
lnode *tmp = (lnode *)malloc(sizeof(lnode));
tmp->data = data;
tmp->next = NULL;
return tmp;
}

int k ;

int main()
{
//freopen("in.txt", "r", stdin);
scanf("%d" , &k) ;
int tmp ;
int len = 0;
lnode *head, *tail;
while(scanf("%d" , &tmp) != EOF && tmp >= 0)
{
if(len == 0){
head = create_node(tmp);
tail = head;
}else{
lnode *node_tmp = create_node(tmp);
tail->next = node_tmp;
tail = node_tmp;
}
len ++;
}
if(k <= 0 || k > len)
printf("NULL\n") ;
else{
// 令p , q相距为k
lnode *p = head;
lnode *q = head;
for(int i = 0; i < k; i ++)
q = q->next;
// q移动到链表尾部,则p移动到倒数第k个位置
while(q != NULL)
{
p = p->next;
q = q->next;
}
printf("%d\n", p->data);
}
return 0 ;
}


寻找和为定值的两个数:http://blog.csdn.net/qq_26437925/article/details/48179185

荷兰国旗:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;

int main()
{
char s[] = "0121120210";
int len = strlen(s);

int current = 0, begin = 0 , end = len -1;
while(current <= end)
{
if(s[current] == '0') {
//char tmp = s[current];
//s[current] = s[begin];
//s[begin] = tmp;
swap(s[current], s[begin]);
begin ++;
current ++;
} else if(s[current] == '1') {
current ++;
} else {
//char tmp = s[current];
//s[current] = s[end];
//s[end] = tmp;
swap(s[current], s[end]);
end --;
}
}
puts(s);
return 0;
}




leetcode     https://leetcode.com/problems/sort-colors/

ac代码

class Solution {
public:
void sortColors(vector<int>& nums) {
int len = nums.size();

int begin = 0; // 0与begin交换
int end = len - 1; // 2与end交换
int current = 0; // 用来遍历

while (current <= end)
{
if (nums[current] == 0)
{
swap(nums[begin], nums[current]);
current++;
begin++;
}
else if (nums[current] == 2)
{
swap(nums[end], nums[current]);
//current++; 这里current 变成了原来的end ,不能current++
end--;
}
else // 1
{
current++;
}
}
}
};


问题4  (链表回文判断)

    对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

测试样例:

1->2->2->1

返回:true

http://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId=49&tqId=29370&rp=5&ru=/ta/2016test&qru=/ta/2016test/question-ranking

/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
// write code here
if (A == NULL)
return false;

if(A->next == NULL)
return true;

// 找到中间节点
ListNode* p = A;
ListNode* q = A;
while (q != NULL)
{
p = p->next;// p移动一次
q = q->next;// q移动两次
if (q != NULL)
{
q = q->next;
}
}

int len = 0;
//反转后面的节点
ListNode* head = NULL;
while (p != NULL)
{
q = p->next;
if (head != NULL)
{
p->next = head;
head = p;
}
else{
head = p;
}
len++;
p = q;
}

// 逐一比较
p = A;
q = head;
for (int i = 0; i < len; i++)
{
if (p->val != q->val)
return false;
p = p->next;
q = q->next;
}
return true;
}
};


234. Palindrome Linked List
题目地址:https://leetcode.com/problems/palindrome-linked-list/

Longest Substring Without Repeating Characters (leetcode)

ac代码,采用了两个指针和一个map结构

参考:http://blog.csdn.net/feliciafay/article/details/16895637

class Solution {
public:
int lengthOfLongestSubstring(string s) {
int len = s.size();
vector<int> mp(256, -1);

int maxLen = 0;

int sta = 0, en = 0;
int curLen = 0;
while (en < len)
{
if (mp[s[en]] == -1)
{
mp[s[en]] = 1;
en++;
}
else{
while (s[sta] != s[en])
{
mp[s[sta]] = -1;
sta++;
}
sta++;
en++;
}
curLen = en - sta;
maxLen = max(maxLen, curLen);
}
return maxLen;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: