《LeetCode零基础指南》(第一讲) 函数

零、了解网站

1、输入输出

  对于算法而言,就是给定一些输入,得到一些输出,在一般的在线评测系统中,我们需要自己手写输入输出函数(例如 C语言中的scanfprintf),而在 LeetCode 这个平台,只需要实现它提供的函数即可。函数的传入参数就代表了的算法的输入,而函数的返回值则代表了的算法的输出。

2、刷题步骤

  找到一道题,以 两整数之和 为例,如何把这道题通过呢?如下图所示:


  第 1 步:阅读题目;

  第 2 步:参考示例;

  第 3 步:思考数据范围;

  第 4 步:根据题意,实现函数的功能;

  第 5 步:本地数据测试;

  第 6 步:提交;


3、尝试编码

  这个题目比较简单,就是求两个数的和,我们可以在编码区域尝试敲下这么一段代码。

int getSum(int a, int b){  // (1)
    return a + b;          // (2)
}
  • ( 1 ) (1) (1) 这里int是C/C++中的一种类型,代表整数,即 Integer,传入参数是两个整数;
  • ( 2 ) (2) (2) 题目要求返回两个整数的和,我们用加法运算符实现两个整数的加法;

4、调试提交


  第 1 步:实现加法,将值返回;

  第 2 步:执行代码,进行测试数据的调试;

  第 3 步:代码的实际输出;

  第 4 步:期望的输出,如果两者符合,则代表这一组数据通过(但是不代表所有数据都能通过哦);

  第 5 步:尝试提交代码;

  第 6 步:提交通过,撒花 🌻🌼🌺🌷🥀;


  这样,我们就大致知道了一个刷题的步骤了。但是,对于零基础来说,编码过程才是最难的,函数到底是什么东西呢?接下来,这一章着重介绍的就是函数了。

一、概念定义

1、函数简介

  函数可以把大的计算任务分解成若干较小的任务,然后通过调用的方式达到代码复用。一个逻辑不写多遍,减少代码维护成本。

  调用函数的一方不需要了解函数的具体实现,对于它来说,这部分是一个 “黑盒子”,从而使得程序结构更加清晰。

  C语言在设计中考虑了函数的 高效性易用性 两个原则。函数的实现应该尽量简短,因为函数可以套函数,一个程序应该尽量由许多小的函数组成,而不是由少量较大函数组成。

2、函数的基本概念

  在刷题的过程中,系统会给我们事先提供一个函数让我们来实现;而它则是调用函数的一方。在C语言中,最常见的当属main函数了。

int main()
{
    printf("5201314\n");
    return 0;
}

  以上就是一个函数,它被称为C语言的 入口函数,或者 主函数。所有程序执行,都是从这个函数开始的,以它为例,我们引出函数的一些基本概念。

3、函数的基本结构

  函数的基本结构如下图所示:


  通过这个图,我们类比main()这个函数,它的 返回类型int32位整型,函数名main参数列表 为 空,函数体printf("5201314\n");返回值 为 0。

4、返回类型

  函数的返回类型可以是任意类型,例如:整型、浮点型、字符型、自定义类型等等。返回类型 和 返回值 是 配套的,当返回类型为void时,函数内部的返回值部分可以写return ;,也可以直接省略不写。

5、函数名

  函数名可以类比我们自己的名字。是给函数调用方用的。例如:mainprintf都是函数名。

6、参数列表

  函数的参数列表必须用()括起来,参数是函数需要处理的数据,例如:

    printf("光天化日学C语言\n");

用来输出字符串,"光天化日学C语言\n"就是一个参数,参数类型是字符串。

7、函数体

  函数体内部就是你可以任意发挥的部分,也就是函数的核心逻辑部分,可以是各种语句的组合。当然也可以是另一个函数,也就是函数是支持嵌套的。

8、返回值

  函数的返回值则表示了这个函数最后返回给调用方的数据,如果返回值的类型和函数的返回类型不一致,则会进行强制类型转换,前提是能够强转的情况下。

二、题目分析

1、整数乘法

  实现一个函数multiply,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。

int multiply(int A, int B){   // (1)
    return A * B;             // (2)
}


   ( 1 ) (1) (1) 这里int是C/C++中的一种类型,代表整数,即 Integer,传入参数是两个整数;

   ( 2 ) (2) (2) 题目要求返回两个整数的乘积,并且要求不能用*,那如果我用了会怎么样?答案是并不会怎么样,因为平台不会去对它做语法分析,只是调用了你的函数,提供一些输入数据,如果输出数据和它给定的相同,就算通过。作为你接触算法的第一道题,其实这些条件都无所谓的,能过就行,他只检测输入输出,不检测你实际代码。

  对于新人来说,把问题过掉比问题本身更重要,题数的增加,是信心的增加,信心比什么都重要,有了信心,你才能继续往下走,只要你能往下推进,你就能继续学习,继续学习你迟早会学到相应的算法。好了,过了这题以后,把这道题放入你的重刷列表,等你对算法有一定理解以后再来用题目要求的方法来过了它。


2、整数除法

  要求实现一个函数divide,给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
  假设我们的环境只能存储 32 位有符号整数,其数值范围是 [ − 2 31 , 2 31 − 1 ] [−2^{31}, 2^{31} − 1] [231,2311]。本题中,如果除法结果溢出,则返回 2 31 − 1 2^{31} − 1 2311

int divide(int a, int b){
    if(a == -2147483648 && b == -1) {
        return 2147483647;            // (1)
    }
    return a / b;                     // (2)
}


   ( 1 ) (1) (1) 仔细思考一下,只有当 a = − 2 31 a = -2^{31} a=231,且 b = − 1 b=-1 b=1 时,除法结果为 2 31 2^{31} 231 会溢出,其它情况都不会溢出,所以这种情况下,直接返回 2 31 − 1 2^{31} − 1 2311

   ( 2 ) (2) (2) 不溢出的情况,直接返回a/b即可,C语言会自己做向下取整;

3、次幂函数

  要求实现一个函数myPow,给定两个数 x x x n n n,求 x n x^n xn

double myPow(double x, int n){  // (1)
    return pow(x, n);           // (2)
}
  • ( 1 ) (1) (1) double是C/C++中的双精度浮点数,即小数;
  • ( 2 ) (2) (2) 不好意思,C语言有现成的求幂函数pow(x,n)就是求 x x x n n n 次幂;

4、开方函数

  实现一个函数mySqrt,给定一个非负整数 x x x ,计算并返回 x x x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

int mySqrt(int x){        // (1)
    return (int)sqrt(x);  // (2) 
}


   ( 1 ) (1) (1) 返回值是传参的算术平方根的取整;

   ( 2 ) (2) (2) 不好意思,这题本来是二分查找,又被水过去了。C语言有取平方根的函数sqrt,记得(int)进行强制转换,不强转估计也没事(会在返回的时候进行自动转换);

5、最值函数

  编写一个函数maximum,找出两个数字 a a a b b b 中最大的那一个。不得使用if-else或其他比较运算符。

int maximum(int a, int b){
    return a > b ? a : b;   // (1)
}


   ( 1 ) (1) (1) 这题考察的是C语言中唯一的三目运算符:条件运算符;

三、推荐学习

🌌《算法零基础100讲》🌌

(第1讲) 幂和对数

四、课后习题

1、必做

序号题目链接难度
1371. 两整数之和★☆☆☆☆
2面试题 17.01. 不用加号的加法★☆☆☆☆
3剑指 Offer 65. 不用加减乘除做加法★☆☆☆☆
4面试题 08.05. 递归乘法★☆☆☆☆
529. 两数相除★☆☆☆☆
650. Pow(x, n)★☆☆☆☆
769. Sqrt(x)★☆☆☆☆
8面试题 16.07. 最大数值★☆☆☆☆

2、选做

序号题目链接难度必做
12119. 反转两次的数字★☆☆☆☆
  • 85
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 80
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 80
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

英雄哪里出来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值