(33)字母在字符串中的百分比(34)判断字符是否唯一(35)IP地址无效化

本文介绍了如何在编程中计算字符串中特定字母的百分比,判断字符是否唯一,以及将IPv4地址转换为无效化版本。通过代码示例展示了使用哈希表和位运算的方法解决这些问题。
摘要由CSDN通过智能技术生成


1. 每日一言

一个人一天也不能没有理想,但凭侥幸,怕吃苦,没有真才实学,再好的理想也实现不了。——张华


2. 题目(33)字母在字符串中的百分比

题目链接:字母在字符串中的百分比

给你一个字符串 s 和一个字符 letter ,返回在 s 中等于 letter 字符所占的 百分比 ,向下取整到最接近的百分比。

  • 示例 1:
    输入:s = “foobar”, letter = “o”
    输出:33
    解释:
    等于字母 ‘o’ 的字符在 s 中占到的百分比是 2 / 6 * 100% = 33% ,向下取整,所以返回 33 。

  • 示例 2:
    输入:s = “jjjj”, letter = “k”
    输出:0
    解释:
    等于字母 ‘k’ 的字符在 s 中占到的百分比是 0% ,所以返回 0 。

提示:
1 <= s.length <= 100
s 由小写英文字母组成
letter 是一个小写英文字母


3. 解题思路

将letter在s中出现的次数记录下来,然后通过计算算出百分比即可

4. 代码

int percentageLetter(char* s, char letter) {
    size_t len=strlen(s);
    double sum = 0;
    for(int i=0;i<len;i++)
    {
        if(letter == s[i])
        {
            sum++;
        }
    }
    return (int)(sum*100/len);
}

5. 题目(34)判断字符是否唯一

题目链接:判断字符是否唯一

实现一个算法,确定一个字符串 s 的所有字符是否全都不同。

  • 示例 1:
    输入: s = “leetcode”
    输出: false

  • 示例 2:
    输入: s = “abc”
    输出: true

限制:
0 <= len(s) <= 100
s[i]仅包含小写字母
如果你不使用额外的数据结构,会很加分。


6. 解题思路

6.1 法一:

使用哈希表,遍历整个字符串,记录每个字母是否出现过

6.2 法二:

使用位运算,创建一个int类型的变量s,用s的二进制的每一位来记录出现过的字母

7. 代码

7.1 法一:



bool isUnique(char* astr){
    bool arr[26]={0};
    
    for(int i=0;astr[i]!='\0';i++)
    {
        if(arr[astr[i]-'a']==true)
        {
            return false;
        }
        else
            arr[astr[i]-'a']=true;
    }
    return true;
}

7.2 法二:



bool isUnique(char* astr){
    int i=0;//字符串下标

    int s=0;
    //s是int类型,它的二进制位数大于26(全部小写字母的个数)
    //我们可以用它来记录每个字母出现的次数

    int a=0;
    while(astr[i])
    {
        a=1<<(astr[i]-'a');
        //记录当前字母对应的位置

        //判断当前位置是否被标记
        if((a&s)==0)
            s+=a;//标记当前位置
        else
            return false;
            
        i++;
    }

    return true;
}

8. 题目(35)IP地址无效化

题目链接:IP地址无效化

给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本。

所谓无效化 IP 地址,其实就是用 “[.]” 代替了每个 “.”。

  • 示例 1:
    输入:address = “1.1.1.1”
    输出:“1[.]1[.]1[.]1”

  • 示例 2:
    输入:address = “255.100.50.0”
    输出:“255[.]100[.]50[.]0”

提示:
给出的 address 是一个有效的 IPv4 地址


9. 解题思路

首先要知道,一个IPv4中只有3个 “ . ”
根据题意,要把每个 " . “替换成” [.] ",相比较原来的字符串,在创建新的字符串时,还需要给新的字符串多分配 2*3 = 6的空间
分配好空间了,接下来就好办了,遍历整个字符串,
如果当前字符不是“ . ”,则直接放入新的字符串中
如果当前字符是“ . ”,则按顺序依次放入“ [ ”、“ . ”、“ ] ”

10. 代码

char * defangIPaddr(char * address){
    int len = strlen(address);//注意strlen函数计算长度时没有把\0数进去
    char* arr = (char*)malloc(len+6+1);
    //在 len+6+1 中,“1” 是为字符'\0'开辟空间
    
    char* p1 = arr;
	//p1 的作用是记录新数组的最后一位

    while(*address)
    {
        if('.' == *address)
        {
            *p1++ = '[';  
            *p1++ = '.';  
            *p1++ = ']';  
        }
        else
        {
            *p1++ = *address;
        }

        address++;
    }

    *p1 = '\0';
    //别忘了在字符串最后加上结束标志

    return arr;
}

11. 结语

请给自己些耐心,一口吃不成胖子。
山外青山楼外楼,莫把百尺当尽头。
保持空杯心态加油努力吧!


都看到这里啦!真棒(*^▽^*)

可以给作者一个免费的赞赞吗,这将会鼓励我继续创作,谢谢大家

编程小白写作,如有纰漏或错误,欢迎指正


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月临水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值