C语言刷题~Leetcode与牛客网简单题

简介: C语言刷题~Leetcode与牛客网简单题

前言

作者:小蜗牛向前冲

名言:我可以接收失败,但我不能接收放弃

如果觉的博主的文章还不错的话,还请 点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。

为了提高自己编写代码的能力,特意开设刷题专题,记录自己刷题的思路和理解。欢迎❀大家的指正。

1 复写零

思路:

对于这道题目我们很容易想到,进行数组遍历,若发现某个元素为0,则从这个元素之后的元素整体向后移动1个元素的大小,但很快会发现这样效率不高。

下面我将用双指针的方法进行解题:

首先,我们用指针top标记数组的栈顶位置,用指针i标记现在需要放置元素位置,

其次,我们要找到原数组中对应放置在最后位置的元素位置,

最后,在数组最后从该位置元素往前来进行模拟放置即可。

//遍历二遍数组就可以完成任务
void duplicateZeros(int* arr, int arrSize)
{
  int top = 0;//用来标记数组
  int i = -1;//用来标记要放置元素的数组
  //开始第一遍遍历数组
  while (top < arrSize)
  {
    i++;
    if (0 == arr[i])
    {
      top += 2;//找到0top标记要向后跳2个元素
    }
    else
    {
      top++;
    }
  }
  int j = arrSize - 1;
  //判读top标记是否超出数组的范围
  if (top > arrSize)
  {
    arr[j] = 0;//新数组最后一个元素必定为0
    j--;
    i--;
  }
  //开始从后往前进行第二遍遍历
  while (j >= 0)
  {
    arr[j] = arr[i];
    j--;
    //若下个元素为0进行复写
    if (!arr[i])
    {
      arr[j] = arr[i];
      j--;
    }
    i--;//指向下个元素
  }
}

2 小乐乐与进制转换

要想将10进制数转转化为6进制数,可以用取余反序法解决。

思路:

将10机制数求余数,将余数存在数组中,在由数组倒序打印就可以了。

#include<stdio.h>
 
int main()
{
    int n = 0;
    int arr[10] = { 0 };//存放6进制的位数
    int i = 0;
    int j = 0;
    scanf("%d", &n);
    while (n)
    {
        arr[i] = n % 6;// 不断的求出6进制数的位数
        n = n / 6;
        i++;
    }
    //输出
    for (j = i - 1;j >= 0;j--)//注意指这里i要-1
    {
        printf("%d", arr[j]);
    }
    return 0;
}

3 小乐乐求和

这题的解题思路很简单,用个循环就可以解决,唯一要n输入的范围是1<=n<10^9。

《C和指针》中写过:long与int:标准只规定long不小于int的长度,int不小于short的长度。

所以intlong的范围都可以认为是(-2^31~(2^31-1)),这将有可能不满足n的取值范围,于是我们应该用long long来定义n的取值范围。

#include<stdio.h>
 
int main()
{
    //输入
    long long n = 0;
    scanf("%llu", &n);
    long long i = 1;
    long long sum = 0;
    while (n >= i)
    {
        sum = sum + i;
        i++;
    }
    //输出
    printf("%llu", sum);//注意这里是以%llu打印
    return 0;
}

4 小乐乐定闹钟

这题主要考察了对%与/运算符的用法,我们主要注意时和分都由二位数组成,所以我们要注意进行前导0补齐(%02d)

#include <stdio.h>
 
int main()
{
    int h = 0;//小时
    int m = 0;//分钟
    int k = 0;//要睡觉的时间
    scanf("%d:%d %d", &h, &m, &k);
    h = ((m+k)/60+h)%24;
    m = (m+k)%60;
    printf("%02d:%02d\n", h, m);
    return 0;
}

5小乐乐与欧几里得

这里我们很容易想到暴力求解,但真的能够通过吗?

#include<stdio.h>
 
int main()
{
    long long n = 0;
    long long m = 0;
    //输入
    scanf("%lld%lld", &n, &m);
    long long max = n > m ? m : n;//假设m和n中较小数位最大公约数
    long long min = n > m ? n : m;//假设m和n中较大数位最小公倍数
    //求最大公约数和最小公倍数
    while (1)
    {
        if (0 == n % max && 0 == m % max)
        {
            break;//找到最大公约数
        }
        max--;
    }
    while (1)
    {
        if (0 == min % n && 0 == min% m)
        {
            break;//找到最小公倍数
        }
        min++;
    }
    printf("%lld", max + min);
    return 0;
}

这里我们发现,这种算法用时会很长导致解题失败。那么还有更好的算法吗?

下面将为大家介绍用辗转相除法解题

辗转相除法(求最大公约数):如果有两个数n,m;且n>m,设n/m商q余c,则n和m的最大公约数也是m和c的最大公约数。这样辗转相除,直到余数为0时除式的商(也就相当于n/m时c那个位置的数字)即为最大公约数

而最小公倍数 = (n*m)/(最大公约数)

这里我们要注意是在求最大公约数的时候,n和m是发生改变了的,所以我们提前存储好他们。

//辗转相除法
int main()
{
    long long n = 0;
    long long m = 0;
    long long tmp = 0;
 
    scanf("%lld %lld", &n, &m);
    int a = n;
    int b = m;
    while (tmp = a % b)
    {
        a = b;
        b = tmp;
    }
    printf("%lld\n", b + m * n / b);
    return 0;
}

今天题就刷到这里了,希望大家能在评论积极分享自己的最优解。


 


相关文章
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
存储 C语言
【C语言】基础刷题训练4(含全面分析和代码改进示例)
【C语言】基础刷题训练4(含全面分析和代码改进示例)
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
57 6
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
114 2
|
21天前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
16 1
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
1月前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
|
1月前
|
机器学习/深度学习 编译器 C语言
C语言刷题(中)(保姆式详解)
C语言刷题(中)(保姆式详解)
15 0
|
3月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
57 7
|
3月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
51 3