文章目录
零、写在前面
该章节节选自 《LeetCode零基础指南》,为入门编程的基础内容,主要是教会大家如何利用现有资源进行刷题。
当然,如果已经对本套体验课了如指掌,那么可以通过 算法全套课程 联系到我,领取限时全套课程优惠。
博主所有的课程都是基于 c/c++ 的,java 我不会,但是我一直强调,学习算法和语言无关,算法只是一个思想,只要学好一门语言,就可以学习算法,虽然这是你的第一道C语言题,但是你可能会遇到这么多知识点 ,千万不要被劝退哦~~
1、输入输出
对于算法而言,就是给定一些输入,得到一些输出,在一般的在线评测系统中,我们需要自己手写输入输出函数(例如 C语言中的scanf
和printf
),而在 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()
这个函数,它的 返回类型 是int
32位整型,函数名 为main
,参数列表 为 空,函数体 为printf("5201314\n");
,返回值 为 0。
4、返回类型
函数的返回类型可以是任意类型,例如:整型、浮点型、字符型、自定义类型等等。返回类型 和 返回值 是 配套的,当返回类型为void
时,函数内部的返回值部分可以写return ;
,也可以直接省略不写。
5、函数名
函数名可以类比我们自己的名字。是给函数调用方用的。例如:main
和printf
都是函数名。
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,231−1]。本题中,如果除法结果溢出,则返回 2 31 − 1 2^{31} − 1 231−1。
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
231−1;
(
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语言中唯一的三目运算符:条件运算符;
三、推荐学习
四、课后习题
坚持!加油!你可以的!
序号 | 题目链接 | 难度 | 必做 |
---|---|---|---|
1 | 371. 两整数之和 | ★☆☆☆☆ | 1 |
2 | 面试题 17.01. 不用加号的加法 | ★☆☆☆☆ | 1 |
3 | 剑指 Offer 65. 不用加减乘除做加法 | ★☆☆☆☆ | 1 |
4 | 面试题 08.05. 递归乘法 | ★☆☆☆☆ | 1 |
5 | 29. 两数相除 | ★☆☆☆☆ | 0 |
6 | 50. Pow(x, n) | ★☆☆☆☆ | 0 |
7 | 69. Sqrt(x) | ★☆☆☆☆ | 0 |
8 | 面试题 16.07. 最大数值 | ★☆☆☆☆ | 0 |
9 | 2119. 反转两次的数字 | ★☆☆☆☆ | 0 |