你是真的“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的幂次方数。


总结撒花💞


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

相关文章
|
2月前
|
弹性计算 安全 容灾
【深度好文】为什么说用好VPC很重要!
本文详细探讨了阿里云VPC(Virtual Private Cloud)的使用方法及其重要性。 VPC作为用户云上的“数据中心”,提供了安全隔离的网络环境,帮助用户构建和管理云服务。文章首先对比了经典网络和VPC的区别,强调了VPC在安全性、灵活性和扩展性方面的优势。接着,通过具体的规划步骤,包括选择地域、账号规划、网段规划、安全隔离设计等,展示了如何有效利用VPC。此外,还介绍了VPC连接互联网的方式及安全措施,以及VPC与IDC互访的解决方案。 总体而言,VPC不仅是用户上云的第一步,更是构建稳定、高效云基础设施的关键。
|
网络安全 数据库
【保姆级教程】基于阿里云搭建网站,看这篇就够了!
本文演示了三种网站的搭建,分别是:博客、论坛、个人作品。从域名选择,到阿里云服务器的购买,到最后的网站搭建。
【保姆级教程】基于阿里云搭建网站,看这篇就够了!
|
19天前
|
弹性计算 人工智能 数据安全/隐私保护
【手把手教你】如何免费畅快使用阿里云ECS搭建私有Overleaf论文写作服务
本文详细介绍如何利用阿里云ECS免费搭建私有Overleaf论文写作服务,包括ECS服务器的部署、Overleaf服务的安装、TexLive包的更新、XeLaTeX修复、中文字体支持及账号管理等步骤。通过这些操作,你可以实现免费且高效的多人协作论文写作,避免付费版本的高昂费用。适合需要频繁合作撰写论文的团队使用。
66 1
【手把手教你】如何免费畅快使用阿里云ECS搭建私有Overleaf论文写作服务
|
人工智能 安全 机器人
新手必看!ChatGPT常见问题总整理,你遇到了几个?
新手必看!ChatGPT常见问题总整理,你遇到了几个?
|
存储 人工智能 机器人
如果有不限量云资源,先来做一个超级大模型
众所周知,人工智能发展的进度与存储能力成正比关系,也就是说存储能力决定了人工智能的发展程度。为什么这样讲?原因就是大数据、云计算都与大容量存储密切相关,尤其是现在井喷式的大数据发展,大体量的数据存储以及运算处理关于存储的要求是上不封顶的需求,就拿近几个月火爆全球的chatGPT的模型也是基于超大超强算力来实现的。
379 1
如果有不限量云资源,先来做一个超级大模型
|
小程序
分享几个免费设计生成及参考工具 (第五期)
今天来给大家分享几个国外免费的PNG图片素材网站
116 0
|
算法 C++
你是真的“C”——经典问题解答技巧(上)
哈喽各位友友们😊,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!😘我仅已此文,和大家分享你是真的“C”——经典问题解答技巧。都是精华内容,可不要错过哟!!!😍😍😍
92 0
|
人工智能 缓存 前端开发
【小百科实战 】以小百科技能为例,走一个完整实践流程|学习笔记
快速学习【小百科实战 】以小百科技能为例,走一个完整实践流程
【小百科实战 】以小百科技能为例,走一个完整实践流程|学习笔记
|
6月前
|
弹性计算 API
大咖与小白的日常:ECS如何对比性能?试试这个API
本文为您介绍阿里云云服务器ECS的选型过程中,可用于对比实例性能的DescribeInstanceTypes API。
下一篇
无影云桌面