前言
😽介绍俩道基础题,使用C语言实现,题目不只文章中的一种做法,只是记录一下这些对于初学者来说不容易想到的思路!
一. 替换空格
1. 题目要求
2. 解题思路
首先求出字符串中有几个空格,
每个空格都需要用%20来替换,%20是三个字符的空间,而原来的空格只占一个字符的空间,也就是说,每有一个空格都需要增加俩个字符的空间才能够将空格替换;
用end1记录原来字符串末字符的位置,用end2记录在原来字符串末尾增加上替换空格所需要增加空间后的位置
然后将end1空间的内容赋值到end2,end1和end2再往前移动一个空间,只要end1指向的空间放置的内容不是空格,将end1空间的内容赋值到end2;
当end1指向的空间是空格时,此时end1再向前移动到空格前面字符的位置;end2此时向前移动三次,分别放置0、2、%;放置完%后end2再向前移动一位到%前面的位置;
重复上述过程直到end1和end,也就是end1和end2指向的位置重合时,所有的空格都被替换完毕。
3. 代码实现
class Solution { public: void replaceSpace(char* str, int length) { char* cur = str; int space_count = 0; while (*cur) { if (*cur == ' ') { space_count++; } cur++; } int end1 = length - 1; int end2 = length - 1 + 2 * space_count; while (end1 != end2) { if (str[end1] != ' ') { str[end2--] = str[end1--]; } else { end1--; str[end2--] = '0'; str[end2--] = '2'; str[end2--] = '%'; } } } };
二. 宏实现整数的二进制奇偶位交换
1. 题目要求
写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。
2. 解题思路
交换奇偶位,需要先分别拿出奇偶位。
既然是宏,分别拿出用循环不是很现实,那就用**按位与(&)**这些位的方式来做。
奇数位拿出,那就是要&上010101010101……;偶数位拿出,就是要&上101010101010……,对应十六进制分别是555……和aaa……,一般我们默认是32位整数,4位对应一位16进制就是8个5,8个a。
通过& 0x55555555的方式拿出奇数位和& 0xaaaaaaa的方式拿出偶数位。
奇数位左移(<<)一位就到了偶数位上,偶数位右移(>>)一位就到了奇数位上,最后两个数字加起来,就完成了交换。
※这个宏只能完成32位以内的整形,要想完成64位的,那就将5和a的数量翻倍即可。
3. 代码实现
#include<stdio.h> #define SWAP_BIT(num) num = (((num&0x55555555)<<1) + ((num&0xaaaaaaaa)>>1)) int main() { int a = 0; scanf("%d", &a); printf("%d\n", SWAP_BIT(a)); return 0; }