モバイルゼロ
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int ptr1 = 0,ptr2 = 1;
if(nums.size()<=1){
return;
}
while(ptr2<nums.size()){
while(nums[ptr2]==0){ //是0则右移到非0位置,但不能超过边界
if(ptr2>=nums.size()-1)
break;
ptr2++;
}
if(nums[ptr1]==0&&nums[ptr2]!=0){ //是0则交换
nums[ptr1] = nums[ptr2];
nums[ptr2] = 0;
}
ptr1++;
if(ptr1>=ptr2) //ptr1超过ptr2唯一的情况就是前面全是非0数
ptr2 = ptr1 + 1;
}
}
};
悪いですが、4msのですが、ロジックはまた、非常に明確であると考えられています。
リスト
リストが動的に決定された各ノードに格納され、ストレージは、非連続的な動的であるので、我々は、挿入、削除ノードO(1)優れた時に取ることができるように、各ノードは、次のノードへのポインタを有しています効果。
鎖の必須要素:ノードポインタ(二、すなわち二重リンクリストであってもよいです)
いくつかの重要なポイント:
チェックリング:スピードポインタを使用して
二つのリストの交差点の最初のポイント:尾から頭出しに不一致のポイントを見つけるために
以下は、非常に単純に反転リストですが、良い点に注意を払う必要があります
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head==NULL)
return NULL;
ListNode* myhead = head->next; //直接从第二跳开始,避免死循环
ListNode* temp = head; //永远指向前一跳,原先的head位置永远都是前一跳!!!
while(myhead!=NULL){
temp->next = myhead->next; //前一跳直接指向下一跳
myhead-> next = head; //将该节点放在头部
head = myhead; //头部变换地址
myhead = temp->next; //换成之前的下一跳
}
return head;
}
};
以下は、コードの回転のリストで、キーはカットです。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(head==NULL||k==0||head->next==NULL)
return head;
int size = 1;//链表长度
ListNode* end = head;//倒数
while(end->next!=NULL){
size+=1;
end=end->next;
}
k = size-k%size; //确认切割位点在第几位
ListNode* end_k = head;//倒数第k
int i = 0;
while(++i<k)
end_k = end_k->next;
end->next = head;
head = end_k->next;
end_k->next = NULL;
return head;
}
};
ハッシュ
ハッシュがマッピング関係であり、我々は、バケットの開発範囲の減少の広い範囲によってデータをハッシュすることができ、またO(1)時間的にターゲットを見つけるために、コンテンツ鍵にマッピングすることができます。簡単に言えば、配列は、ハッシュの1つのマッピングの最も単純なものである訪問します。
class MyHashSet {
private:
bool a[1000100];
public:
/** Initialize your data structure here. */
MyHashSet() {
for(int i=0;i<1000100;i++)
a[i] = false;
}
void add(int key) {
a[key] = true;
}
void remove(int key) {
a[key] = false;
}
/** Returns true if this set contains the specified element */
bool contains(int key) {
return a[key];
}
};
上記の最も簡単であるが、現実には、それを使用しません。。。。
概要
++ハッシュライブラリCメソッドを呼び出します。
unordered_set <整数> HashSetの。
hashset.insert(2)。
hashset.erase(2)。
hashset.count(2)
ベクターの空ベクター法<整数>()スワップ(NUMS);