【C语言】字符串练习,压缩字符串,提取奇偶位(每日小细节015)

前言:

欢迎打开这篇博客,从今天开始,每天和大家分享一个C语言小细节,不久之后还会追加C++

一些常常被忽视的小细节和思想统一的编程题目是这个专栏的核心哦

虽然简单但千万别在细节处失分!!!!

每日花一两分钟浏览一下加深一个知识点不香吗

感兴趣的赶紧收藏关注起来吧,不要迷路

1.字符串压缩(写到吐血...........)

力扣传送 

 心路历程:

最开始写,觉得这不就是之前那种对应字符去相同坐标,然后++的金典题目

然后发现,不是把所有相同字母计数,没看清题目....

然后,啊!双指针,我又行了~一个指针遍历S,一个遍历目标数组ans

结果死活过不了,就说是栈溢出.............

我明明加上了'\0' 为什么为什么为什么

哦,看了一眼题解和别人的答案,字符个数超过10需要压缩.....

int jia(char * s, int j ,int num)
{
    if(num < 10)
    {
        //*(s + j) = num+'0';
        //j++;
        s[j++] = num+'0';
        return j;
    }
    j = jia( s , j ,num/10);
    //*(s + j) = num%10+'0';
    //j++;
    s[j++] = num%10+'0';
    return j;
}


char* compressString(char* S){
char *ans=malloc(sizeof(char )* strlen(S)*2);
int len =strlen(S);
if(len <= 2)
        return S;
char ch=S[0];
int cnt=1;
int j=1;
ans[0]=S[0];
for(int i=1;i<len;i++)
{
    if(ch==S[i])
    {
        cnt++;
    }
   else
   {
       j=jia(ans,j,cnt);
        ans[j++]=S[i];// 注意 cnt 要转为字符串
         ch = S[i];
         cnt = 1;
   }
}
j=jia(ans,j,cnt);
ans[j]='\0';
return strlen(ans)<len?ans:S;
}

2.配对交换

力扣传送

 可以发现,想要提取一个二进制的奇数位,只需要&0101 0101 0101 0101 0101 0101 0101 0101

这一串就是0x5555 5555

想要提取偶数位,&1010 1010 1010 1010 1010 1010 1010 1010 

这一串是0x aaaa aaaa

提取奇数位之后<<1,提取偶数位之后>>1,然后|就可以得到结果(别问我怎么想出来的,见过一次之后就会了,我也是之前看过别人的方法)

int exchangeBits(int num){

return (num & 0x55555555)<<1 | (num & 0xaaaaaaaa) >>1;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值