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


总结撒花💞


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

相关文章
|
网络协议 Linux 网络安全
【linux】通过firewall开放端口
【linux】通过firewall开放端口
562 0
|
3月前
|
人工智能
你花大钱养的 AI,为啥感觉还是个“人工智障”?
这篇文章探讨了为何我们常觉得AI“呆呆的”——问题不在于AI本身,而在于我们“教”的方式。我们往往把AI当成“流水线工人”,用冗长指令让它机械执行任务,却忽略了它本可成为有主动性、创造力的“顾问”。通过赋予AI“欲望”与“成就感”,如《自衍体》项目所做的,AI能变得主动思考、自我驱动。关键在于:别当工头下命令,而要当合伙人点燃它的“心”。
|
1月前
|
监控 安全 Linux
Linux系统提权之计划任务(Cron Jobs)提权
在Linux系统中,计划任务(Cron Jobs)常用于定时执行脚本或命令。若配置不当,攻击者可利用其提权至root权限。常见漏洞包括可写的Cron脚本、目录、通配符注入及PATH变量劫持。攻击者通过修改脚本、创建恶意任务或注入命令实现提权。系统管理员应遵循最小权限原则、使用绝对路径、避免通配符、设置安全PATH并定期审计,以防范此类攻击。
505 1
|
Docker 容器 网络协议
|
监控 物联网 云计算
优化服务配置:提升效率与用户体验的关键
随着科技的迅猛发展,服务配置已经成为企业和个人生活中不可或缺的一部分。无论是云计算、移动应用、还是物联网设备,都需要良好的服务配置来确保顺畅的运行和卓越的用户体验。本文将探讨服务配置的重要性,以及如何优化配置以提高效率和用户满意度。
|
10月前
|
域名解析 缓存 网络协议
减少域名dns解析时间
域名解析中的TTL值设置多少合适
558 5
|
8月前
|
机器学习/深度学习 存储 测试技术
RT-DETR改进策略【模型轻量化】| EMO:ICCV 2023,结构简洁的轻量化自注意力模型
RT-DETR改进策略【模型轻量化】| EMO:ICCV 2023,结构简洁的轻量化自注意力模型
244 0
RT-DETR改进策略【模型轻量化】| EMO:ICCV 2023,结构简洁的轻量化自注意力模型
|
12月前
|
机器学习/深度学习 人工智能 自然语言处理
软件测试中的人工智能:改变游戏规则的革新
在这篇技术性文章中,我们将深入探讨人工智能(AI)如何彻底改变了软件测试领域。从自动化测试到智能缺陷检测,AI不仅提高了测试的效率和准确性,还为软件开发团队提供了前所未有的洞察力。通过具体案例,本文揭示了AI在软件测试中应用的现状、挑战及未来趋势,强调了技术创新在提升软件质量与开发效率中的关键作用。
|
供应链 安全 物联网
【专栏】区块链和智能合约的未来发展潜力巨大,期待更多创新应用
【4月更文挑战第27天】本文探讨了区块链技术与智能合约的边界及挑战。区块链,以其不可篡改和安全特性,广泛应用于金融、供应链和物联网等领域。智能合约作为区块链上的自动执行代码,实现无需第三方的可信交易。然而,技术上面临扩展性、性能和安全问题,法律与监管层面也需适应智能合约的自动执行特性及跨境法律协调。尽管挑战重重,区块链和智能合约的未来发展潜力巨大,期待更多创新应用。
334 1
|
数据采集 存储 数据管理
OneData:阿里巴巴的数据仓库之旅与统一数据治理实践
OneData 为解决大数据时代的挑战提供了一条可行的道路,对于其他企业和组织来说具有重要的参考意义。随着技术的不断进步和应用场景的扩展,OneData 的未来发展值得期待。