你是真的“C”——经典问题解答技巧(下)

简介: 写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。求出 5位数中的所有 Lily Number。求出0~100000之间的所有“水仙花数”并输出。不允许创建临时变量,交换两个整数的内容写一个函数返回参数二进制中 1 的个数。获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?如何判断一个数是不是 2 的幂次方?总结撒花💞

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。


例如:给定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 的个数。


微信图片_20230428162421.png

比如: 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的幂次方数。


总结撒花💞


   本篇文章旨在分享几道曾今自己感到疑惑的经典题目。希望大家通过阅读此文有所收获!😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘

相关文章
|
5月前
|
弹性计算 Linux 测试技术
ECS网页问题之认证实验考不了如何解决
ECS(Elastic Compute Service,弹性计算服务)是云计算服务提供商提供的一种基础云服务,允许用户在云端获取和配置虚拟服务器。以下是ECS服务使用中的一些常见问题及其解答的合集:
|
存储 弹性计算 运维
《企业运维之弹性计算原理与实践》——第四章 ECS 进阶概念-安全——第四章(下):ECS 安全操作演示(1)
《企业运维之弹性计算原理与实践》——第四章 ECS 进阶概念-安全——第四章(下):ECS 安全操作演示(1)
79 0
|
弹性计算 运维 网络安全
《企业运维之弹性计算原理与实践》——第一章 云网络总览与概述——第一章(下)实验:ECS 云服务器新手上路(下)
《企业运维之弹性计算原理与实践》——第一章 云网络总览与概述——第一章(下)实验:ECS 云服务器新手上路(下)
121 0
|
Web App开发 弹性计算 运维
《企业运维之弹性计算原理与实践》——第一章 云网络总览与概述——第一章(下)实验:ECS 云服务器新手上路(上)
《企业运维之弹性计算原理与实践》——第一章 云网络总览与概述——第一章(下)实验:ECS 云服务器新手上路(上)
154 0
|
存储 弹性计算 运维
《企业运维之弹性计算原理与实践》——第二章 ECS 基础入门——第二章(上):ECS 基础入门(1)
《企业运维之弹性计算原理与实践》——第二章 ECS 基础入门——第二章(上):ECS 基础入门(1)
155 0
|
存储 弹性计算 运维
《企业运维之弹性计算原理与实践》——第二章 ECS 基础入门——第二章(上):ECS 基础入门(3)
《企业运维之弹性计算原理与实践》——第二章 ECS 基础入门——第二章(上):ECS 基础入门(3)
165 0
|
弹性计算 运维 资源调度
《企业运维之弹性计算原理与实践》——第二章 ECS 基础入门——第二章(上):ECS 基础入门(6)
《企业运维之弹性计算原理与实践》——第二章 ECS 基础入门——第二章(上):ECS 基础入门(6)
141 0
|
存储 弹性计算 运维
《企业运维之弹性计算原理与实践》——第二章 ECS 基础入门——第二章(上):ECS 基础入门(5)
《企业运维之弹性计算原理与实践》——第二章 ECS 基础入门——第二章(上):ECS 基础入门(5)
161 0
|
存储 弹性计算 运维
《企业运维之弹性计算原理与实践》——第二章 ECS 基础入门——第二章(上):ECS 基础入门(2)
《企业运维之弹性计算原理与实践》——第二章 ECS 基础入门——第二章(上):ECS 基础入门(2)
137 0
|
弹性计算 运维 安全
《企业运维之弹性计算原理与实践》——第二章 ECS 基础入门——第二章(上):ECS 基础入门(4)
《企业运维之弹性计算原理与实践》——第二章 ECS 基础入门——第二章(上):ECS 基础入门(4)
145 0