データベース構造(C)+ハッピー数

モバイルゼロ

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);

公開された23元の記事 ウォンの賞賛0 ビュー556

おすすめ

転載: blog.csdn.net/CSDN_Yong/article/details/104882553