atoi等各种小函数的用法需要学习,及时更新在这个贴子里


1:atoi string.c_str()函数的基本使用
string str = "10"; //string转数字
int res = atoi(str.c_str());
2:  链表快速排序和插入排序问题
    2.1 单链表快速排序
    //1216 leetcode 148
    //这个也是链表排序 但是要求 在 O(n log n) 时间复杂度和常数级空间复杂度下
    ListNode* sortList_Leetcode148(ListNode* head) {
        if((head == NULL) || (head != NULL && head->next == NULL)) return head;   
        quickSort_Leetcode148(head,NULL);
        return head;
    }

    ListNode* partitions_QuickSortListNodeLeetcode148(ListNode* start,ListNode* end)
    {
        ListNode* p = start;
        ListNode* q = p->next;
        int value = p->val;
        while (q != end)
        {
            if(q->val < value)
            {
                p = p->next;

                int tmp = p->val;
                p->val = q->val;
                q->val = tmp;
            }
            q = q->next;
        }

        int tmp = p->val;
        start->val = tmp;
        p->val = tmp;
        return p;
    }

    void quickSort_Leetcode147(ListNode* start,ListNode* end)
    {
        if(start != NULL && start->next != NULL && start != end)
        {
            ListNode* mid = partitions_QuickSortListNodeLeetcode148(start,end);
            quickSort_Leetcode148(start,mid);
            quickSort_Leetcode148(mid->next,end);
        }
    }
    2.2  单链表插入排序
    ListNode* sortList(ListNode* head) {
        if((head == NULL) || (head != NULL && head->next == NULL)) return head;   
        ListNode* dumy = new ListNode(0);
        dumy->next = new ListNode(head->val);
        ListNode* cur = dumy->next;
        ListNode* pre = dumy;
        while (head->next != NULL)
        {
            pre = dumy;
            cur = pre->next;
            ListNode* tmp = new ListNode(head->next->val);
            if(tmp->val < cur->val)
            {
                tmp->next = cur;
                pre->next = tmp;
            }
            else
            {
                while ((cur != NULL) && (cur->val < tmp->val))
                {
                    cur = cur->next;
                    pre = pre->next;
                }
                pre->next = tmp;
                tmp->next = cur;
            }
            head = head->next;
        }
        return dumy->next;

    }
3:
unordered_map迭代器失效
    unordered_map<int,int> unmap;
    unmap.insert(pair<int,int>(1,2));
    unmap.insert(pair<int,int>(3,6));
    unmap.insert(pair<int,int>(5,9));

    for(auto it = unmap.begin();it != unmap.end();it++)
    {
        cout<<it->first<<" "<<it->second<<endl;
    }

    for(auto it = unmap.begin();it != unmap.end();)
    {
        if(it->first == 3) unmap.erase(it++); //unordered_map 迭代器失效
        else
        {
            it++;
        }
        
    }
    cout<<"after erase"<<endl;
    for(auto it = unmap.begin();it != unmap.end();it++)
    {
        cout<<it->first<<" "<<it->second<<endl;
    }
4: LRU缓存机制 leetcod 146
先放测试用例
   /*
    cout<<"null ";
    LRUCache* lru = new LRUCache(10);
    lru->put(10,13);
    lru->put(3,17);
    lru->put(6,11);
    lru->put(10,5);
    lru->put(9,10);
    lru->get(13);
    lru->put(2,19);
    lru->get(2);
    lru->get(3);
    lru->put(5,25);
    lru->get(8);
    lru->put(9,22);
    lru->put(5,5);
    lru->put(1,30);
    lru->get(11);
    lru->put(9,12);
    lru->get(7);
    lru->get(5);
    lru->get(8);
    lru->get(9);
    lru->put(4,30);
    lru->put(9,3);
    lru->get(9);
    lru->get(10);
    lru->get(10);
    lru->put(6,14);
    lru->put(3,1);
    lru->get(3);
    lru->put(10,11);
    lru->get(8);
    lru->put(2,14);
    lru->get(1);
    lru->get(5);
    lru->get(4);
    lru->put(11,4);
    lru->put(12,24);
    lru->put(5,18);
    lru->get(13);
    lru->put(7,23);
    lru->get(8);
    lru->get(12);
    lru->put(3,27);
    lru->put(2,12);
    lru->get(5);
    lru->put(2,9);
    lru->put(13,4);
    lru->put(8,18);
    lru->put(1,7);
    lru->get(6);
    lru->put(9,29);
    lru->put(8,21);
    lru->get(5);
    lru->put(6,30);
    lru->put(1,12);
    lru->get(10);
    lru->put(4,15);
    lru->put(7,22);
    lru->put(11,26);
    lru->put(8,17);
    lru->put(9,29);
    lru->get(5);
    lru->put(3,4);
    lru->put(11,30);
    lru->get(12);
    lru->put(4,29);
    lru->get(3); //从这个地方开始错的
    lru->get(9);
    lru->get(6);
    lru->put(3,4);
    lru->get(1);
    lru->get(10);
    lru->put(3,29);
    lru->put(10,28);
    lru->put(1,20);
    lru->put(11,13);
    lru->get(3);
    lru->put(3,12);
    lru->put(3,8);
    lru->put(10,9);
    lru->put(3,26);
    lru->get(8);
    lru->get(7);
    lru->get(5);
    lru->put(13,17);
    lru->put(2,27);
    lru->put(11,15);
    lru->get(12);
    lru->put(9,19);
    lru->put(2,15);
    lru->put(3,16);
    lru->get(1);
    lru->put(12,17);
    lru->put(9,1);
    lru->put(6,19);
    lru->get(4);
    lru->get(5);
    lru->get(5);
    lru->put(8,1);
    lru->put(11,7);
    lru->put(5,2);
    lru->put(9,28);
    lru->get(1);
    lru->put(2,2);
    lru->put(7,4);
    lru->put(4,22);
    lru->put(7,24);
    lru->put(9,26);
    lru->put(13,28);
    lru->put(11,26);
    */

再放源代码,这个我这个超时了。
//20_1216 LRU
class LRUCache {
public:
    // 这个超时了。/
    LRUCache(int capacity) {
        capacitys = capacity;
        count = 0;
        matches.clear();
    }
    
    int get(int key) {
        if(matches.find(key) == matches.end()) 
        {
            cout<<-1<<" ";
            return -1;
        }
        queue<int> q1;

        int cur = key;
        while (!q.empty())
        {
            int tmp = q.front();
            q.pop();
            if(tmp == cur) continue;
            else
            {
                q1.push(tmp);
            }
            
        }
        q1.push(cur);
        q = q1;
        
        cout<<matches[key]<<" ";
        return matches[key]; 
    }
    
    void put(int key, int value) {
        queue<int> q1;
        int cur = key;

        if(matches.find(key) == matches.end())
        {
            count++;
            if(count > capacitys) count = capacitys+1;
        }

        if(count > capacitys)
        {
            int tmp = q.front();
            q.pop();
            q.push(key);
            matches[key] = value;
            for(auto it = matches.begin(); it != matches.end();)
            {
                if(it->first == tmp) matches.erase(it++);
                else it++;
            }
            count--;
        }
        else
        {
            matches[key] = value;
            
            while (!q.empty())
            {
                int tmp = q.front();
                q.pop();
                if(tmp == cur) continue;
                else
                {
                    q1.push(tmp);
                }
                
            }
            q1.push(cur);
            q = q1;

        }
        cout<<"null "; 
    }

    int count;
    int capacitys;
    unordered_map<int,int> matches;
    queue<int> q;

};

5:非递归遍历二叉树,前序遍历和中序,非递归后序有点难,暂时不写
先放用例
    Solution solution;
    TreeNode* tree10 = new TreeNode(7);
    TreeNode* tree12 = new TreeNode(10);
    TreeNode* tree11 = new TreeNode(9,NULL,tree12);

    TreeNode* tree1 = new TreeNode(4,tree10,tree11);
    TreeNode* tree2 = new TreeNode(5);
    TreeNode* tree3 = new TreeNode(6);
    TreeNode* tree4 = new TreeNode(2,tree1,tree2);
    TreeNode* tree5 = new TreeNode(3,NULL,tree3);
    TreeNode* tree6 = new TreeNode(1,tree4,tree5);
    TreeNode* root = tree6;

    

    vector<vector<int>> travelFloorRes = solution.travelTreeNodeByFloor(root);
    for(int i =0;i<travelFloorRes.size();i++)
    {
        for(int j =0;j<travelFloorRes[i].size();j++)
        {
            cout<<travelFloorRes[i][j]<<" ";
        }
        cout<<endl;
    }

    cout<<"middle travel TreeNode by stack is "<<endl;
    vector<int> middleTravelRes = solution.middleTravel(root);
    for_each(middleTravelRes.begin(),middleTravelRes.end(),[](auto x){cout<<x<<" ";});
    cout<<endl;

    cout<<"pre travel TreeNode by stack is "<<endl;
    vector<int> preTravelRes = solution.preorderTraversal(root);
    for_each(preTravelRes.begin(),preTravelRes.end(),[](auto x){cout<<x<<" ";});
    cout<<endl; 
然后是代码
    //1218 非递归解法前序遍历
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> res;
        if(root == NULL) return res;
        stack<TreeNode*> s;
        TreeNode* p = root;
        while (!s.empty() || p)
        {
            while (p)
            {
                //cout<<"cur val is "<<p->val<<endl;
                res.push_back(p->val);
                s.push(p);
                p = p->left;
            }
            if(!s.empty())
            {
                TreeNode* tmp = s.top();
                s.pop();
                p = tmp->right;
            }
            
        }
        
        return res;
    }

    vector<int> middleTravel(TreeNode* root)
    {
        vector<int> res;
        if(root == NULL) return res;
        stack<TreeNode*> s;
        TreeNode* p = root;
        while (!s.empty() || p != NULL)
        {
            while (p != NULL)
            {
                s.push(p);
                p = p->left;
            }

            if(!s.empty())
            {
                TreeNode* tmp = s.top();
                s.pop();
                res.push_back(tmp->val);
                p = tmp->right;
            }
        }
        return res;
    }

3. STL巧妙小函数使用
    判断vector等容器是否含有某个数,代码如下
    
    cout<<"In main test "<<endl;
    vector<int> v2 = {10,12,14,16};
    auto pos = std::find(v2.begin(),v2.end(),100);
    if(pos != v2.end()) cout<<"v2 find yes"<<endl;
    else cout<<"v2 no"<<endl;
4. 

map的key如果是结构体需要注意什么问题

map中的key默认是以less<>升序对元素排序(排序准则也可以修改),也就是说key必须具备operator<对元素排序,而平常我们的用的基本上都是基本类型元素作为key,所以就不存在这个问题了

所以要对结构体中<号进行重载操作才行

重载运算符应该注意重载小于号要有2个const,注意后面的const。










全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务