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

简介: 哈喽各位友友们😊,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!😘我仅已此文,和大家分享你是真的“C”——经典问题解答技巧。都是精华内容,可不要错过哟!!!😍😍😍

微信图片_20230427214238.gif

😎博客昵称:博客小梦

😊最喜欢的座右铭:全神贯注的上吧!!!

😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!

😘博主小留言:哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘

微信图片_20230427160707.gif


前言🙌



   哈喽各位友友们😊,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!😘我仅已此文,和大家分享你是真的“C”——经典问题解答技巧。都是精华内容,可不要错过哟!!!😍😍😍


喝汽水问题🙌


喝汽水问题


题目内容


喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程实现)

微信图片_20230428161032.png


解题方法一源码分享:

int main()
{
  int money = 0;
  scanf("%d", &money);//20
  int empty = money;
  int total = money;
  while (empty >= 2)
  {
    total += empty / 2;
    empty = empty / 2 + empty%2;
  }
  printf("%d\n", total);
  return 0;
}


解题方法二源码分享:

int main()
{
  int money = 0;
  scanf("%d", &money);//20
  int total = 0;
  if(money>0)
    total = 2 * money - 1;
  printf("%d\n", total);
  return 0;
}


写一个函数,可以逆序一个字符串的内容。


做题链接:逆序一个字符串

void Reverse(char* str)
{
    char* left = str;
    char* right = str + strlen(str)-1;
    while(left < right)
    {
        char temp = *left;
        *left = *right;
        *right = temp;
        ++left;
        --right;
    }
}
int main()
{
    char str[] = "hello bit";
    //在这里完成下面函数,参数自己设计,要求:使用指针
    Reverse(str);
    return 0;
}
// 注意:如果是在线OJ时,必须要考虑循环输入,因为每个算法可能有多组测试用例进行验证,参考以下main函数写法,
int main()
{
    char str[101] = {0};
    while(gets(str))
    {
        Reverse(str);
        printf("%s\n", str);
        memset(str, 0, sizeof(str)/sizeof(str[0]));
    }
    return 0;
}


调整数组使奇数全部都位于偶数前面。


题目:


输入一个整数数组,实现一个函数,

来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,

所有偶数位于数组的后半部分。


思路:


1.给定两个下标left和right,left放在数组的起始位置,right放在数组中最后一个元素的位置

2.循环进行一下操作

  • a. 如果left和right表示的区间[left, right]有效,进行b,否则结束循环
  • b. left从前往后找,找到一个偶数后停止
  • c. right从后往前找,找到一个奇数后停止
  • d. 如果left和right都找到了对应的数据,则交换,继续a,
void swap_arr(int arr[], int sz)
{
  int left = 0;
  int right = sz-1;
  int tmp = 0;
  while(left<right)
  {
     // 从前往后,找到一个偶数,找到后停止
    while((left<right)&&(arr[left]%2==1))
    {
      left++;
    }
    // 从后往前找,找一个奇数,找到后停止
    while((left<right)&& (arr[right]%2==0))
    {
      right--;
    }
     // 如果偶数和奇数都找到,交换这两个数据的位置
     // 然后继续找,直到两个指针相遇
    if(left<right)
    {
      tmp = arr[left];
      arr[left] = arr[right];
      arr[right] = tmp;
    }
  }
}


实现一个函数,可以左旋字符串中的k个字符。


例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB


方法一:设计循环使其可以旋1次,然后让他执行n次是一个最简单的思路:

void leftRound(char * src, int time)
{
  int i, j, tmp;
  int len = strlen(src);
  time %= len; //长度为5的情况下,旋转6、11、16...次相当于1次,7、12、17...次相当于2次,以此类推。
  for (i = 0; i < time; i++) //执行k次的单次平移
  {
    tmp = src[0];
    for(j = 0; j < len - 1; j++) //单次平移
    {
      src[j] = src[j + 1];
    }
    src[j] = tmp;
  }
}


这个思路当然可以,但是一次一次转毕竟太麻烦,就不能一次到位么?


方法二:

当然可以,我们可以选择拼接法,一次到位:

void leftRound(char * src, int time)
{
  int len = strlen(src);
  int pos = time % len; //断开位置的下标
  char tmp[256] = { 0 }; //更准确的话可以选择malloc len + 1个字节的空间来做这个tmp
  strcpy(tmp, src + pos); //先将后面的全部拷过来
  strncat(tmp, src, pos); //然后将前面几个接上
  strcpy(src, tmp); //最后拷回去
}


这个方法要用到一个数组形成的辅助空间,让人觉得有点不爽。


方法三:

还可以有更好的选择,例如ABCDEFG,左旋3次后变成DEFGABC,有一个特殊的操作

先将要左旋的前三个家伙逆序(CBADEFG),然后将后半段也逆序(CBAGFED),最后整体逆序(DEFGABC)即可。这样只需要做数值交换即可,可以写一个函数帮我们完成局部逆序,代码如下:

void reverse_part(char *str, int start, int end) //将字符串从start到end这一段逆序
{
  int i, j;
  char tmp;
  for (i = start, j = end; i < j; i++, j--)
  {
    tmp = str[i];
    str[i] = str[j];
    str[j] = tmp;
  }
}
void leftRound(char * src, int time)
{
  int len = strlen(src);
  int pos = time % len;
  reverse_part(src, 0, pos - 1); //逆序前段
  reverse_part(src, pos, len - 1); //逆序后段
  reverse_part(src, 0, len - 1); //整体逆序
}

这样就舒服多了。


相关文章
|
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”——经典问题解答技巧(下)
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。 求出 5位数中的所有 Lily Number。 求出0~100000之间的所有“水仙花数”并输出。 不允许创建临时变量,交换两个整数的内容 写一个函数返回参数二进制中 1 的个数。 获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同? 如何判断一个数是不是 2 的幂次方? 总结撒花💞
131 0
|
人工智能 缓存 前端开发
【小百科实战 】以小百科技能为例,走一个完整实践流程|学习笔记
快速学习【小百科实战 】以小百科技能为例,走一个完整实践流程
【小百科实战 】以小百科技能为例,走一个完整实践流程|学习笔记
|
6月前
|
弹性计算 API
大咖与小白的日常:ECS如何对比性能?试试这个API
本文为您介绍阿里云云服务器ECS的选型过程中,可用于对比实例性能的DescribeInstanceTypes API。
下一篇
无影云桌面