你是真的“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); //整体逆序
}

这样就舒服多了。


相关文章
|
3月前
|
弹性计算 人工智能 数据安全/隐私保护
【手把手教你】如何免费畅快使用阿里云ECS搭建私有Overleaf论文写作服务
本文详细介绍如何利用阿里云ECS免费搭建私有Overleaf论文写作服务,包括ECS服务器的部署、Overleaf服务的安装、TexLive包的更新、XeLaTeX修复、中文字体支持及账号管理等步骤。通过这些操作,你可以实现免费且高效的多人协作论文写作,避免付费版本的高昂费用。适合需要频繁合作撰写论文的团队使用。
254 1
【手把手教你】如何免费畅快使用阿里云ECS搭建私有Overleaf论文写作服务
|
Linux 数据安全/隐私保护
【转】阿里云服务器入门使用流程 新手学习教程
一、阿里云根据个人需要选合适的云服务器,选好cpu、内存、带宽,地域,这四个是主要的。其他可以默认选择。
5602 1
【转】阿里云服务器入门使用流程 新手学习教程
|
人工智能 安全 机器人
新手必看!ChatGPT常见问题总整理,你遇到了几个?
新手必看!ChatGPT常见问题总整理,你遇到了几个?
|
Linux 数据安全/隐私保护
阿里云服务器入门使用流程 新手学习教程
阿里云根据个人需要选合适的云服务器,选好cpu、内存、带宽,地域,这四个是主要的。其他可以默认选择。
4660 0
|
存储 运维 监控
如何用阿里云服务器建立个人网站(针对新手)
首先,我们需要购买阿里云服务器和域名。域名建议用.com后缀的(一般五十左右),想要便宜的域名可以买.top等后缀的(一般几块钱)。云服务器的话,根据自己的需要购买,如果只是简单的发发文章图片,视频等,网站访问量不高的话,买个1核2G1M的配置也能够用。当然,如果对响应速度等体验比较看重的话,可以买个稍微高点配置的,比如2核4G的这样的。
20255 2
如何用阿里云服务器建立个人网站(针对新手)
|
弹性计算 容灾 安全
阿里云服务器购买指南关于新手小白的图文指导教程
2023阿里云服务器购买指南关于新手小白的图文指导教程,2023阿里云服务器购买流程更新,选购云服务器有两个入口,一个是选择活动机,只需要选择云服务器地域、系统、带宽即可;另一个是在云服务器页面,自定义选择云服务器配置,这种方式购买云服务器较为复杂,需要选付费方式、地域及可用区、ECS实例规格、镜像、网络、公网IP、安全组等配置,阿里云百科来阿里云服务器购买流程指南2023新版教程:
161 0
阿里云服务器购买指南关于新手小白的图文指导教程
|
弹性计算 容灾 安全
阿里云服务器购买指南(适合新手小白的图文指导教程)
阿里云服务器购买指南(适合新手小白的图文指导教程)选购云服务器有两个入口,一个是选择活动机,只需要选择云服务器地域、系统、带宽即可;另一个是在云服务器页面,自定义选择云服务器配置,这种方式购买云服务器较为复杂,需要选付费方式、地域及可用区、ECS实例规格、镜像、网络、公网IP、安全组等配置
382 0
阿里云服务器购买指南(适合新手小白的图文指导教程)
你是真的“C”——经典问题解答技巧(下)
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。 求出 5位数中的所有 Lily Number。 求出0~100000之间的所有“水仙花数”并输出。 不允许创建临时变量,交换两个整数的内容 写一个函数返回参数二进制中 1 的个数。 获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同? 如何判断一个数是不是 2 的幂次方? 总结撒花💞
141 0
|
人工智能 缓存 前端开发
【小百科实战 】以小百科技能为例,走一个完整实践流程|学习笔记
快速学习【小百科实战 】以小百科技能为例,走一个完整实践流程
【小百科实战 】以小百科技能为例,走一个完整实践流程|学习笔记