每日学习——4.4号

每日学习——4.4号,第1张


前言:

今天是写博客第一天,想要将csdn的博客作为我每日进步的见证。


首先说明一下,此次专栏连载的内容会非常杂,会包括一天学习所得的所有内容,即可能包括我的必修课和数学建模,算作是记录我学习足迹的一个平台吧。


正文:

1.对于sort函数,注意其cmp函数要在类外面定义,不然会出错。


可参考这篇文章。


错误:reference to non-static member function must be called_initMyHeart的博客-CSDN博客

这个经验源于审错题了,忽略数组元素要连续的条件,将数组排序了,导致错误,因此思考的。


这个题目在下面也会探讨。


2.runtime error: addition of unsigned offset to 0x602000000130 overflowed to 0x60200000012c (stl_vector.h)
原因很简单,往往是由于下标出现了小于零的-1。


3.字典树:

有两种方法:

1.用链表模拟

2.用数组模拟空间(上面的idx纯粹是标记一下此处有值了);

代码如下(示例):

有关动态存储数组的可以看一下这篇博客:

C++建立动态二维数组_longshengguoji的博客-CSDN博客_c++定义动态二维数组

#include
using namespace std;
#include
const int n = 26;//每一个结点能延伸出多少子节点
/*这是构建二维数组,咱们只用到指针数组的部分
使用数组指针,分配一个指针数组,将其首地址保存在b中,然后再为指针数组的每个元素分配一个数组
              
           int **b=new int*[row];       //分配一个指针数组,将其首地址保存在b中                                                    
           for(i=0;ison[c] == nullptr)//友元不能访问私有数据??????
            {
                p->son[c] = new tire(s[i]);//直接调用构造函数
            }
            p = p->son[c];
        }
        p->cnt++;
    }
    friend int search(string s, tire* root);

};
int search(string s,tire* root)
{
    tire* p = root;
    for (int i = 0; i < s.size(); i++)
    {
        int c = s[i] - 'a';
        if (p->son[c] == nullptr)
        {
            return 0;
        }
        else
        {
            p = p->son[c];
        }
    }
    return p->cnt;
}
int tire2[105][n];
int cnt[105];
int idx = 0;
void insert(string s)
{
    int p = 0;
    for (int i = 0; i < s.size(); i++)
    {
        int c = s[i] - 'a';
        if (!tire2[p][c])tire2[p][c] = ++idx;
        p = tire2[p][c];
    }
    cnt[p]++;
}
int search(string s)
{
    int p = 0;
    for (int i = 0; i < s.size(); i++)
    {
        int c = s[i] - 'a';
        if (!tire2[p][c])return 0;
        p = tire2[p][c];
    }
    return cnt[p];
}
int main()
{

}

例题:

构造字典树:
力扣

const int n=26;

class Trie {
public:
char val;
Trie**son;
int cnt;
    /** Initialize your data structure here. */
    Trie(char a=0) {
        val=a;
        son=new Trie*[26];
        for(int i=0;ison[c]==nullptr)
            {
                p->son[c]=new Trie(word[i]);
            }
            p=p->son[c]; 
        }
        p->cnt++;
    }
    
    /** Returns if the word is in the trie. */
    bool search(string word) {
        Trie*p=this;
        for(int i=0;ison[c]==nullptr)return 0;//非常的奇怪:此处用p索引,直接写son会错。


好吧 //我是憨憨,一点也不奇怪,这仍然在root的成员函数中,显然son还是root的son,怎么可能对嘛!! p=p->son[c]; } return p->cnt; } /** Returns if there is any word in the trie that starts with the given prefix. */ bool startsWith(string word) { Trie*p=this; for(int i=0;ison[c]==nullptr)return 0; p=p->son[c]; } return 1; } }; /** * Your Trie object will be instantiated and called as such: * Trie* obj = new Trie(); * obj->insert(word); * bool param_2 = obj->search(word); * bool param_3 = obj->startsWith(prefix); */

 4.

线段树:

力扣

这个一开始sum的终止条件写错了,不知道怎么想的写成了start<=l&&r>=end.这就不可能对了。


还有,传进去的是要求给定的数组大小,而不是你模拟完全二叉树的数组大小。


void bulid(vector& nums,vector&nod,int node,int start,int end)
{
    if(start==end)
   { nod[node]=nums[start];
   return ;
   }
    
    int mid=(end-start)/2+start;
    int left_node=2*node+1;
    int right_node=2*node+2;
    bulid(nums,nod,left_node,start,mid);
    bulid(nums,nod,right_node,mid+1,end);
    nod[node]=nod[left_node]+nod[right_node];
}
void up(vector&nod,int node,int start,int end,int index,int val)
{
    if(start==end)
    {
        nod[node]=val;
        return;
    }
      int mid=(end-start)/2+start;
      int left_node=2*node+1;
    int right_node=2*node+2;
      if(index>=start&&index<=mid)
      {
          up(nod,left_node,start,mid,index,val);
      }
      else
      {
          up(nod,right_node,mid+1,end,index,val);
      }
      nod[node]=nod[left_node]+nod[right_node];
}
int sum(vector&nod,long long  node,long long  start,long long  end,int l,int r)
{
    if(rend)//终止条件不要找错!!!
    return 0;
    if(start>=l&&end<=r)
    {
        return nod[node];
    }
     long long  mid=(end-start)/2+start;
      long long  left_node=2*node+1;
    long long  right_node=2*node+2;
    return sum(nod,left_node,start,mid,l,r)+sum(nod,right_node,mid+1,end,l,r);

}
class NumArray {
vectornode;
int size=0;
public:
    NumArray(vector& nums) {
        node.resize(100000,0);
        size=nums.size();
        
        bulid(nums,node,0,0,size-1);
    }
    
    void update(int index, int val) {
    up(node,0,0,size-1,index,val);

    }
    
    int sumRange(int left, int right) {
      return   sum(node,0,0,size-1,left,right);
 
    }
};

/**
 * Your NumArray object will be instantiated and called as such:
 * NumArray* obj = new NumArray(nums);
 * obj->update(index,val);
 * int param_2 = obj->sumRange(left,right);
 */

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/567694.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存