双指针,前后指针法, 快排思路, 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; } };
相关文章推荐
- 评教辅助
- 耐心去解决问题
- 第三次冲刺总结
- Unity-关于Rigidbody如何使用代码冻结位置和旋转
- nginx和php的基本配置说明
- 动作原理
- think in java笔记:for each 循环
- 函数
- Spring框架的设计理念于设计模式分析(一)
- nginx proxy优化
- Motan学习开篇
- leetcode(2)3sum-closest
- Leetcode Word Break
- office 365试用地址
- Mycat启动时日志报log4j:ERROR setFile(null,false) call failed.
- 如何访问本地的FTP地址
- Unity中玩家通过点击行走 或 滑动屏幕行走的实现
- English - according to 的用法说明
- 2016年上半年openjudge一些零散题目总结
- tomcat优化