本文讲解力扣算法(LeetCode)第9题(回文数操作),用VB语言的解法教程。通过本文的练习,老铁们可以更加深入的掌握VB递归循环的思路,熟悉并掌握While循环的用法。
我们先看一下题目:
题目描述
输入:x = 121
输出:true
解释:从左向右读, 为 -121 。从右向左读, 为 121- 。因此它不是一个回文数。
解释:从右向左读, 为 01 。因此它不是一个回文数。
力扣官方给的这道题的题解非常精妙、逻辑也很完备,但是理解起来还是有一定的困难(起码我是这样),于是我给了一套自己的简单方法,主要思路是运用While Wend循环。
官方题解相对比较复杂,因为考虑了负数和尾号为0的情况,我给的答案简单一些,适合新手。按照惯例,本教程分为三大部分:
完整代码
原理演示
代码解释
完整代码
力扣算法第9题(回文数)简单方法的完整VB代码(基于Access数据库)如下,在实际应用时要学会调用。
Option Compare Database
'力扣算法第9题,官方解题过程比较缜密
'我这个方法比较简单一些,适合初学者
Function reverse(x As Double)
reverse = 0 '起始值为0
While (x > 0) '输入数字大于0时,继续循环
reverse = reverse * 10 + x Mod 10
'x Mod 10是取余函数,68 mod 10 = 8
'68除以10,60能除动,8除不动
'8 mod 10 = 8
x = x \ 10
'符号\代表除完之后取整,68 \ 10 = 6
'6 \ 10 = 0
Wend '继续循环,直到x \ 10值为0
End Function
我可以把官方题解的思路(我已经改装成VB语言,可以直接模块调用)给大家,大家对比一下各自的优劣。本节课讲简单版本的解题思路。
Option Compare Database
Function revertedNumberJudge(x As Long) As String
Dim revertedNumber As Long
If x < 0 Then
revertedNumberJudge = "该数不是回文数!"
Else
revertedNumber = 0
While x > revertedNumber
revertedNumber = revertedNumber * 10 _
+ x Mod 10
x = x \ 10
Wend
If x = Int(revertedNumber) Or _
x = Int(revertedNumber \ 10) Then
revertedNumberJudge = "该数是回文数!"
Else
revertedNumberJudge = "该数不是回文数!"
End If
End If
End Function
— 2 —
原理演示
力扣算法第9题(回文数)我给的解题思路,是通过While Wend循环,给定一个输入的数字x,不停的取这个数字的最后一位,把这位数字乘以10再加上下一次的最后一位,直到所有位数全部取完,数字就倒转过来了。
本案例取x值为“12345”,reverse(数字倒转回来的值)初始值为0,这可以视为第0次循环。
第1次循环,
reverse值=reverse*10 + x Mod 10,由于reverse的初始值为0,12345 mod 10(mod取模函数,非常常用)的值为5,因此第1次循环后,reverse的值为5。
计算完reverse值之后,x也要进行去尾处理,x \ 10=12345 \ 10=1234
(注:在VB语言中,“\”表示整除,得到商但不含小数,比如3 \ 5 = 0)。
第2次循环,
reverse值=reverse*10 + x Mod 10,现在reverse的值为5,x的值为1234,那么reverse=5*10 + 1234 Mod 10 = 54。
由于x>0,计算reverse值之后,根据While Wend程序设置,要继续对x=1234进行去尾处理,x \ 10=123。
第3次循环,
reverse值=reverse*10 + x Mod 10=54*10 + 123 Mod 10 = 543。
继续对x=123进行去尾处理,x \ 10=12。
第4次循环,
reverse值=reverse*10 + x Mod 10=543*10 + 12 Mod 10 = 5432。
继续对x=12进行去尾处理,x \ 10=1。
第5次循环,
reverse值=reverse*10 + x Mod 10=5432*10 + 1 Mod 10 = 54321。
继续对x=1进行去尾处理,x \ 10=0。
注意,这时x已经=0,不满足While x>0的条件,因此循环结束。
代码解释
力扣算法第9题(回文数)的简单解法,语句比较精炼,思想也比较巧妙,核心是利用现有函数Mod取模、符号“\"整除去尾进行循环计算。
完整代码如下(去掉了代码注释)
Option Compare Database
Function reverse(x As Double)
reverse = 0
While (x > 0)
reverse = reverse * 10 + x Mod 10
x = x \ 10
Wend
End Function
本案例是在模块中进行编程,应用的时候进行临时调用。
Function reverse(x As Double)
reverse(x)就是一个函数y=f(x),x是自变量,reverse相当于因变量。输入x的值,Function就会做相应的计算,reverse就是计算的结果。
x是输入的数字,reverse是数字反转后的数字。
reverse = 0
While (x > 0)
reverse = reverse * 10 + x Mod 10
x = x \ 10
Wend
End Function
这段代码是循环代码,注意从reverse开始循环的,reverse=0是必须有的。
reverse计算在前,x计算在后,顺序不能搞错。
reverse和x都利用了递归的原理,不停的计算并且调用原来的自己(我没理解错吧,是递归?)直到循环条件While(x>0)不成立为止。
reverse*10就是把上一次得到的数字乘以10,再加上x Mod 10得到的尾数,完成了一次数字调转。这是第1次计算,然后89进行去尾操作,x=8。
比如89这个数,第1次循环reverse=0,直接加上89 Mod 10=9,因此第1次循环后reverse=9,x=8。
第2次循环,reverse要先加上第1次循环后的自己,reverse=9*10,再加上x Mod 10 = 8 Mod 10 = 8,reverse=90+8=98。
x这时候再进行去尾操作就等于0了,因为8\10=0。
因为x=0不符合While(x>0)的条件,循环到此戛然而止。
这段代码还是非常短小精悍的,体现了递归的思想和能力,充分利用了把复杂问题分解化、简单化的计算机编程思想。
Access数据库窗体中调用代码如下:
Option Compare Database
Private Sub Text1_AfterUpdate()
Text2 = reverse(Val(Nz(Text1)))
If Val(Text2) = Val(Text1) Then
Text3 = "是回文数"
Else
Text3 = "不是回文数"
End If
End Sub
Private Sub Text1_Change()
Me.Refresh
End Sub
这段调用代码就比较容易理解了,
Text2 = reverse(Val(Nz(Text1)))
直接调用reverse这个我们封装好的模块函数,就能直接计算数字倒转的结果,非常简洁。
If Val(Text2) = Val(Text1) Then
Text3 = "是回文数"
Else
Text3 = "不是回文数"
End If
这一段是判断是否是回文数的语句,如果输入文本框Text1=输出文本框Text2.那么就是回文数,如果不相等那就不是回文数。
这就是力扣算法第9题的简单版解题方法,当然有更复杂、更简洁、更严谨的方法,也就是官方给的方法,留待下回分解吧。