日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

「小算法」回文数与数值合法性检验

發布時間:2024/7/5 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 「小算法」回文数与数值合法性检验 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

喵喵喵,小夕最近準備復習一下數學和基礎算法,盡量每篇推送下面會附帶點數學和基礎算法的小文章。說不定哪天就用(考)到了呢( ̄? ̄)注意哦,與頭條位的文章推送不同,「小公式」和「小算法」里的小標題之間可能并無邏輯關聯。

回文數

鏈接:https://leetcode.com/problems/palindrome-number/description/

判斷一個整數是否是回文數是leetcode上的一個簡單算法題。回文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。

例1:

輸入:121 輸出:true

例2:

輸入:-121 輸出:false 解釋:從右往左讀為121-。

例3:

輸入:10 輸出:false

解這個題的話,一個很自然而簡單的想法就是將整數轉換為字符串,并檢查字符串是否為回文。但是,這需要額外的非常量空間來創建問題描述中所不允許的字符串。

第二個想法是將數字本身反轉,然后將反轉后的數字與原始數字進行比較,如果它們是相同的,那么這個數字就是回文。 但是,如果反轉后的數字大于 int.MAX,會發生數值溢出啦!

不過,按照第二個想法,為了避免數字反轉可能導致的溢出問題,為什么不考慮只反轉 int 數字的一半?畢竟如果該數字是回文,其后半部分反轉后肯定與原始數字的前半部分相同的呀。

所以直接上代碼(原諒我用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自帶大數運算的特性(即不存在撞槍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

數值合法性檢驗

鏈接:https://leetcode.com/problems/valid-number/description/

這個算法題是一個對初學者寫到吐,對有基礎的人寫著玩兒的一道題。題目很簡單,就是判斷用戶的輸入(字符串形式)是不是一個合法的數值。這里合法的數值其實就是我們平常所說的數字啦,比如123,-1.0,+423,.4234,2.345e21都是合法數值。當然這里還允許用戶在合法數值的前后插入若干空格。

這個問題如果直接用if else while生寫的話會寫到吐,而且極難debug。但是這個問題一個機智的做法就是直接上確定有限狀態自動機(deterministic finite automation, DFA)。

DFA是由

  • 一個非空有限的狀態集合Q

  • 一個輸入字母表(非空有限的字符集合)

  • 一組轉移函數(如)

  • 一個開始狀態

  • 一個接受(終止)狀態的集合

  • 所組成的5元組。這個在編譯原理、NLP基礎里都有講,忘了的同學自行補上哦。

    所以很自然的這個題目畫出的狀態機如下圖

    有了狀態機,代碼就變得簡潔多了。這里貼出python實現(來自leetcode討論區,小夕在此題悲劇)

    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


    嗯,就醬╮(╯▽╰)╭

    總結

    以上是生活随笔為你收集整理的「小算法」回文数与数值合法性检验的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。