5/111

复习了下哈夫曼树:

哈夫曼树口诀:

1.构造森林全是根

2.选用两小造新人

3.删除两小添新人

4.重复23剩单根

小注意:哈夫曼树中的节点度数为0或2,并没有1

包含n个叶子节点的哈夫曼树一共有2n-1个节点

且包含n个节点的哈夫曼树要经过n-1次合并才能得到哈夫曼树。

并且这n-1个产生的节点都具有两个孩子的分支节点

typedef struct node
{
int weight;
    
int parent;    
int lch,rch;

}HTNode , *HuffmanTree;

void CreatHuffmanTree(HuffmanTree HT, int n)
{
    if(n <= 1)
    return ;
    
    int num = 2*n-1;//一共2n-1个数组
    
    int s1,s2;
    
    HT = new HTNode[m+1];
    
    //初始化数据
    for(int i=1;i<=num;i++)
    {
        HT[i].lch=0,HT[i].rch=0,HT[i].parent=0;
    }
    
    //输入每个节点的权值
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&HT[i].weight);
    }
    
    //对哈夫曼树进行合并
    for(int i=n+1;i<=num;i++)
    {
        
    findMin(HT,i-1,&s1,&s2);
    //在HT[k](1<=k<=i-1)中选择两个其双亲节点为0,
    //并且权值最小的节点,返回它们的序号s1和s2
    
    
    HT[s1].parent=i;HT[s2].parent=i;
    //给其双亲赋值,并表示从数组比较中删除了
    
    HT[i].lch=s1;HT[i].rch=s2;
    //s1,s2分别作为i的左右孩子
    
    HT[i].weight=HT[s1].weight+HT[s2].weight;
    //i的权值就是左右孩子权值的和
    
    }
    
}

1016. 子串能表示从 1 到 N 数字的二进制串

难度中等

111

给定一个二进制字符串 s 和一个正整数 n,如果对于 [1, n] 范围内的每个整数,其二进制表示都是 s 的 子字符串 ,就返回 true,否则返回 false 。

子字符串 是字符串中连续的字符序列。

示例 1:

输入:s = "0110", n = 3输出:true

示例 2:

输入:s = "0110", n = 4输出:false

用字符串比较,在一次遍历暴力解决即可,

strstr:

strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。

自己写了个strstr,一开始不知道可以直接调用,调用之后更方便。

int  strstr(char *ch1,char *ch2)
{
    int len1,len2;
    
    len1 = strlen(ch1);
    len2 = strlen(ch2);
    
    for(int i = 0; i < len1 ; i++)
    {
     int s = 0; 
     while(s < len2)  
     if(ch2[s] != ch1[s+i])
     continue;
     if(s >= len2)
     return 1;                                                                
    }

return 0;
}
void i_to_b(char* s, int num)
{
    int len = 0;

    while(num > 0)
    {
        s[len++] = '0' + (num & 1);
        num /= 2;
    }

    s[len] = '\0';
    int left = 0;
    len--;

    while(left < len)
    {
        char temp = s[len];
        s[len] = s[left];
        s[left] = temp;
        len--;
        left++;
    }
}

bool queryString(char * s, int n)
{
    char bin[32];

    for( int i = 1; i <= n; i++ )
    {
        i_to_b(bin , i);

        if( strstr(s , bin) == NULL )
        return false;
    }

    return true;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值