「小算法」回文数与数值合法性检验
喵喵喵,小夕最近準備復習一下數(shù)學和基礎算法,盡量每篇推送下面會附帶點數(shù)學和基礎算法的小文章。說不定哪天就用(考)到了呢( ̄? ̄)注意哦,與頭條位的文章推送不同,「小公式」和「小算法」里的小標題之間可能并無邏輯關聯(lián)。
回文數(shù)
鏈接:https://leetcode.com/problems/palindrome-number/description/
判斷一個整數(shù)是否是回文數(shù)是leetcode上的一個簡單算法題。回文數(shù)是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數(shù)。
例1:
輸入:121 輸出:true例2:
輸入:-121 輸出:false 解釋:從右往左讀為121-。例3:
輸入:10 輸出:false解這個題的話,一個很自然而簡單的想法就是將整數(shù)轉換為字符串,并檢查字符串是否為回文。但是,這需要額外的非常量空間來創(chuàng)建問題描述中所不允許的字符串。
第二個想法是將數(shù)字本身反轉,然后將反轉后的數(shù)字與原始數(shù)字進行比較,如果它們是相同的,那么這個數(shù)字就是回文。 但是,如果反轉后的數(shù)字大于 int.MAX,會發(fā)生數(shù)值溢出啦!
不過,按照第二個想法,為了避免數(shù)字反轉可能導致的溢出問題,為什么不考慮只反轉 int 數(shù)字的一半?畢竟如果該數(shù)字是回文,其后半部分反轉后肯定與原始數(shù)字的前半部分相同的呀。
所以直接上代碼(原諒我用python寫\(//?//)\)
class Solution(object):def isPalindrome(self, x):""":type x: int:rtype: bool"""if x < 0 or (x != 0 and x % 10 == 0):return Falseinvx = 0while invx < x:invx = invx * 10 + x % 10x //= 10return invx == x or invx // 10 == x當然,得益于python自帶大數(shù)運算的特性(即不存在撞槍int.MAX的情況),在python里直接用第二種方法解也是可以acc的。
class Solution(object):def isPalindrome(self, x):""":type x: int:rtype: bool"""if x < 0:return Falserawx = xinvx = 0while x > 0:invx = invx * 10 + x % 10x //= 10return invx == rawx數(shù)值合法性檢驗
鏈接:https://leetcode.com/problems/valid-number/description/
這個算法題是一個對初學者寫到吐,對有基礎的人寫著玩兒的一道題。題目很簡單,就是判斷用戶的輸入(字符串形式)是不是一個合法的數(shù)值。這里合法的數(shù)值其實就是我們平常所說的數(shù)字啦,比如123,-1.0,+423,.4234,2.345e21都是合法數(shù)值。當然這里還允許用戶在合法數(shù)值的前后插入若干空格。
這個問題如果直接用if else while生寫的話會寫到吐,而且極難debug。但是這個問題一個機智的做法就是直接上確定有限狀態(tài)自動機(deterministic finite automation, DFA)。
DFA是由
一個非空有限的狀態(tài)集合Q
一個輸入字母表(非空有限的字符集合)
一組轉移函數(shù)(如)
一個開始狀態(tài)
一個接受(終止)狀態(tài)的集合
所組成的5元組。這個在編譯原理、NLP基礎里都有講,忘了的同學自行補上哦。
所以很自然的這個題目畫出的狀態(tài)機如下圖
有了狀態(tài)機,代碼就變得簡潔多了。這里貼出python實現(xiàn)(來自leetcode討論區(qū),小夕在此題悲劇)
class Solution(object):def isNumber(self, s):""":type s: str:rtype: bool"""#define a DFAstate = [{}, {'blank': 1, 'sign': 2, 'digit':3, '.':4}, {'digit':3, '.':4},{'digit':3, '.':5, 'e':6, 'blank':9},{'digit':5},{'digit':5, 'e':6, 'blank':9},{'sign':7, 'digit':8},{'digit':8},{'digit':8, 'blank':9},{'blank':9}]currentState = 1for c in s:if c >= '0' and c <= '9':c = 'digit'if c == ' ':c = 'blank'if c in ['+', '-']:c = 'sign'if c not in state[currentState].keys():return FalsecurrentState = state[currentState][c]if currentState not in [3,5,8,9]:return Falsereturn True
嗯,就醬╮(╯▽╰)╭
總結
以上是生活随笔為你收集整理的「小算法」回文数与数值合法性检验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么回归问题用MSE?
- 下一篇: 【小夕精选】YJango 7分钟带你领略