写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
本题当然可以将所有旋转后的结果放到一个数组里,然后进行查找,但是这种做法既不好操作,也太费事,但是这题有一个很简单的做法:
其实ABCDE无论怎么旋,旋转后的所有结果,都包含在了ABCDEABCD这个字符串里了。所以做法很简单,只需要将原字符串再来一遍接在后面,然后找一找待查找的字符串是不是两倍原字符串的子集即可。
int findRound(const char * src, char * find) { char tmp[256] = { 0 }; //用一个辅助空间将原字符串做成两倍原字符串 strcpy(tmp, src); //先拷贝一遍 strcat(tmp, src); //再连接一遍 return strstr(tmp, find) != NULL; //看看找不找得到 }
求出 5位数中的所有 Lily Number。
//12345 12345/10 12345%10 12345/100 12345%100=45 12345/1000 12345%1000=345 12345/10000 12345%10000=2345 int main() { int i = 0; for (i = 10000; i <= 99999; i++) { //判断i是否是lily number int j = 0; int sum = 0; for (j = 1; j <= 4; j++) { int n = (int)pow(10, j); sum += (i / n) * (i % n); } if (sum == i) { printf("%d ", i); } } return 0; }
求出0~100000之间的所有“水仙花数”并输出。
//“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1 ^ 3+5 ^ 3+3 ^ 3,则153是一个“水仙花数”
//自幂数
#include <math.h> int main() { int i = 0; //i for (i = 0; i <= 100000; i++) { //判断i是否是自幂数 //1. 计算i的位数 - n int n = 1; int tmp = i; while (tmp /= 10) { n++; } //2. 计算i的每一位的n次方和 tmp = i; int sum = 0; while (tmp) { sum += pow(tmp % 10, n); tmp /= 10; } //3. 判断 if (sum == i) { printf("%d ", i); } } return 0; }
不允许创建临时变量,交换两个整数的内容
a^0 = a a^a = 0 int main() { int a = 3; int b = 5; //int tmp = a; //a = b; //b = tmp; //a = a ^ b; //b = a ^ b; //a = a ^ b; printf("a=%d b=%d", a, b); return 0; }
写一个函数返回参数二进制中 1 的个数。
比如: 15 0000 1111 4 个 1
-1
10000000000000000000000000000001
11111111111111111111111111111110
11111111111111111111111111111111
这个算法对负数有点问题 int count_one_bit(int num) { int count = 0; while (num) { if (num % 2 == 1) { count++; } num /= 2; } return count; } -1 int count_one_bit(unsigned int num) { int count = 0; while (num) { if (num % 2 == 1) { count++; } num /= 2; } return count; } int count_one_bit(int num) { int count = 0; int i = 0; for (i = 0; i < 32; i++) { if (((num >> i) & 1) == 1) { count++; } } return count; } int count_one_bit(int num) { int count = 0; while (num) { num = num & (num - 1); count++; } return count; } int main() { int num = 0; scanf("%d", &num);//10 20 15 -1 int ret = count_one_bit(num); printf("%d\n", ret); return 0; }
获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 0 1
int main() { int num = 0; scanf("%d", &num); int i = 0; //偶数位 for (i = 31; i >= 1; i -= 2) { printf("%d ", (num >> i) & 1); } printf("\n"); //奇数位 for (i = 30; i >= 0; i -= 2) { printf("%d ", (num >> i) & 1); } printf("\n"); return 0; }
两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
/ 01
10
int main() { int m = 0; int n = 0; int i = 0; scanf("%d %d", &m, &n); int count = 0; for (i = 0; i < 32; i++) { if (((m >> i) & 1) != ((n >> i) & 1)) { count++; } } printf("%d\n", count); return 0; } int main() { int m = 0; int n = 0; int i = 0; scanf("%d %d", &m, &n); int count = 0; //异或 - 相同为0,相异为1 //010 //001 //011 int ret = m ^ n; while (ret) { ret = ret & (ret - 1); count++; } printf("%d\n", count); return 0; }
如何判断一个数是不是 2 的幂次方?
//2 的幂次方 的数:二进制中只有1个1
//2 - 10
//4 - 100
//8 - 1000
// …
当 n&(n-1) == 0 时,该数就是2的幂次方数。
总结撒花💞
本篇文章旨在分享几道曾今自己感到疑惑的经典题目。希望大家通过阅读此文有所收获!😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘