作者:一个喜欢猫咪的的程序员
专栏:《Leetcode》
喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》
目录
面试题 01.06. 字符串压缩:
https://leetcode.cn/problems/compress-string-lcci/
题目描述:
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
示例:
思路:
开辟一个数组tmp(大小为S的大小x2+1),每次先将字符先存进去,计算每个字符的个数,然后存进去,个数存进去的细节可以注意看看注释,注释较为详细。
代码:
char* compressString(char* S) { char* tmp = (char*)malloc(sizeof(char) * (2 * strlen(S) + 1)); int cur = 0;//用来遍历S的下标 int n = 0;//用来赋值tmp和S的下标 while (cur < strlen(S)) { int num = 1; tmp[n++] = S[cur]; int i = cur;//算每个字符的个数 while (i < strlen(S)) { if (tmp[n - 1] != S[i + 1]) { break; } i++; num++; } char s = '0'; if (num > 9) {//放在num>9,求余 int a = 0; while (num > pow(10, a)) a++;//4934,a=4 if (num % (int)pow(10, a - 1) == 0) a--; if (num < pow(10, a)) a--; int m = num; while (m > 0) { if (m / (int)pow(10, a) > 9)//防止除完这个数大于9 tmp[n++] = s + (m / pow(10, a) - 9); else tmp[n++] = s + (m / pow(10, a)); m = m % (int)pow(10, a--); } if(num % 10==0) tmp[n++] = s + (num % 10); } else tmp[n++] = s + num; cur += num; } tmp[n] = '\0'; if (strlen(S) <= strlen(tmp)) return S; return tmp; }
面试题 05.07. 配对交换
https://leetcode.cn/problems/exchange-lcci/
题目描述:
配对交换。编写程序,交换某个整数的奇数位和偶数位,尽量使用较少的指令(也就是说,位0与位1交换,位2与位3交换,以此类推)。
示例:
代码:
int exchangeBits(int num){ int a2=0x55555555; int a1=0x2aaaaaaa; a1=num&a1;//保留奇数位,偶数位一定为0 a2=num&a2;//保留偶数位,奇数位一定为0 a2=a2<<1;//偶数变奇数. a1=a1>>1;//奇数位边偶数 return a1|a2; }