前言:
欢迎打开这篇博客,从今天开始,每天和大家分享一个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;
}