6.使用leetcode去练习语言

目录

  • [1 本章预览](#1 本章预览)
  • [2 简单题举例](#2 简单题举例)
    • [2.1 题目描述](#2.1 题目描述)
    • [2.2 题目解析](#2.2 题目解析)
    • [2.3 题解](#2.3 题解)
    • [2.4 涉及基础语法](#2.4 涉及基础语法)
  • [3 中等题举例](#3 中等题举例)
    • [3.1 题目描述](#3.1 题目描述)
    • [3.2 题目解析](#3.2 题目解析)
    • [3.3 题解](#3.3 题解)
    • [3.4 涉及基础语法](#3.4 涉及基础语法)
  • [4 本章小结](#4 本章小结)

1 本章预览

事实上本章并不会去讲述go语言的基础情况,而是去介绍如何使用Leetcode去帮助我们去学习go语言的基本语法,当然本章的内容也适合于其他语言。

Leetcode是一个很好的在线判题系统(Online Judge,OJ),它几乎支持所有主流语言的学习,例如C/C++,Java,Python, Go, JavaScript等等。

使用Leetcode学习编程语言有以下好处:

  1. 提供实时反馈:在线判题系统可以立即对提交的程序进行编译和执行,并返回结果,这有助于学习者及时了解自己的代码是否正确,以及程序的运行时间和内存使用情况。
  2. 自动评测:在线判题系统可以自动判断程序的正确性,这使得学习者可以专注于编写代码的逻辑,而不必担心测试和调试的问题。
  3. 适合初学者:对于初学者来说,在线判题系统提供了一个安全、可靠的环境,让他们可以自由地尝试和练习编程,不用担心会破坏或影响其他程序。
  4. 自我挑战:在线判题系统通常会有一些难度不一的题目,学习者可以通过解决这些问题来提高自己的编程技能和解决问题的能力。
  5. 社区支持:在线判题系统通常有一个社区功能,学习者可以在这里与其他人交流、分享代码和经验,这有助于提高学习者的编程技能和编程兴趣。

总之,使用在线判题系统学习编程语言可以帮助学习者提高编程技能、解决问题能力和编程兴趣。

2 简单题举例

2.1 题目描述

13. 罗马数字转整数

罗马数字包含以下七种字符: IVXLCDM

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II27 写做 XXVII, 即为 XX + V + II

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给定一个罗马数字,将其转换成整数。

2.2 题目解析

学习完go语言的基础部分,事实上我们有多种方法去解题,为了存储罗马数字和阿拉伯数字的关系我们使用数据类型map,,转化成阿拉伯数字相加,然后我们发现遍历当前的值比当前右边的值小时要减当前值,反之加上当前值,例如IV,第1个I要减1,第2个V要加5。

看解决简单题事实上很简单,1.决定关键数据存储类型 2.决定程序的算法。为此事实上程序就是数据结构加上算法。

2.3 题解

go 复制代码
var riMap = map[byte]int{
	'I': 1,
	'V': 5,
	'X': 10,
	'L': 50,
	'C': 100,
	'D': 500,
	'M': 1000,
}

func romanToInt(s string) int {
	ans := 0
	i := 0
	for i = 0; i < len(s)-1; i++ {
		if riMap[s[i]] < riMap[s[i+1]] {
			ans -= riMap[s[i]]
		} else {
			ans += riMap[s[i]]
		}
	}
	ans += riMap[s[i]]
	return ans
}

2.4 涉及基础语法

函数,分支选择结构,循环结构,字符串,

3 中等题举例

3.1 题目描述

8. 字符串转换整数 (atoi)

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。

函数 myAtoi(string s) 的算法如下:

  1. 读入字符串并丢弃无用的前导空格
  2. 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
  3. 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
  4. 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
  5. 如果整数数超过 32 位有符号整数范围 [−2^31, 2^31 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −2^31 的整数应该被固定为 −2^31 ,大于 2^31 − 1 的整数应该被固定为 2^31 − 1
  6. 返回整数作为最终结果。

注意:

  • 本题中的空白字符只包括空格字符 ' '
  • 除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。

3.2 题目解析

一个整数我们可以分成2个部分:1. 符号字符(或者没有) +/- 2.数字字符,我们先判断是否存在正负号,然后读取数字字符,按位相加,同时看看是否超过限制就能达到我们的目的

3.3 题解

go 复制代码
func myAtoi(s string) int {
	ans := 0
	sign := 0
	for i := range s {
		switch {
		case s[i] == ' ' && sign == 0:  //当前空格,并且之前还未出现符号
		case s[i] == '+' && sign == 0:  //当前+,并且之前未出现符号
			sign = 1
		case s[i] == '-' && sign == 0:  //当前-,并且之前未出现符号
			sign = -1
		case s[i] <= '9' && s[i] >= '0' && sign == 0:  //当前数字字符,并且之前未出现符号
			sign = 1
			ans = ans*10 + int(s[i]-'0')
		case s[i] <= '9' && s[i] >= '0' && sign != 0: //当前数字字符,并且之前出现符号
			ans = ans*10 + int(s[i]-'0')
			if sign*ans > math.MaxInt32 { //当前数字字符超过最大值截断
				return math.MaxInt32
			}
			if sign*ans < math.MinInt32 { //当前数字字符小于最大值截断
				return math.MinInt32
			}
		default: //其他情况
			return sign * ans 
		}
	}
	return sign * ans
}

3.4 涉及基础语法

函数,分支选择结构,循环结构,数据范围(int当前是64位的,这个在第3章分析过leetcode是64位操作系统),字符串

4 本章小结

我们通过简单题和中等题的解答可以看到使用Leetcode等OJ学习语言的基础语法会变得很简单,而且成本很低。语法错误,程序正确性均由Leetcode去判定,可以提高我们的逻辑思辨能力和考虑问题的全面性,哪怕是像本次举例的题目那样简单的需求。

你别看我是很简单地写出了题解,事实上我在这些题目上面翻过不少车

如本次的中等题