TLP-Task02研究ノート


この記事は、Datawhaleチームの調査計画の21番目のLeetCodeが選択したトピックグループTask01調査ノートです。
初心者の方は少し時間がかかり、多くの解決策は詳細に分析されておらず、将来改訂される予定ですので、ご容赦ください。
すべてのトピックは、Datawhale学習ドキュメントのオープンソースアドレスを参照しています:
https //github.com/datawhalechina/team-learning-program/tree/master/LeetCodeTencent

007整数反転

ソース:LeetCode
リンク:https ://leetcode-cn.com/problems/reverse-integer

32ビットの符号付き整数を指定すると、各整数の桁を反転する必要があります。

注:
環境が32ビットの符号付き整数のみを格納できると仮定すると、値の範囲は[-2 ^ 31、2 ^ 31 −1]です。この仮定によれば、整数が反転後にオーバーフローした場合、0を返します。

入力:x = 123、出力:321
入力:x = -123、出力:-321
入力:x = 120、出力:21
入力:x = 0、出力:0

アイデア

この質問は主にオーバーフローの問題を考慮しています。主なアイデアリファレンス:
https//leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-leetcode/(公式の問題解決策、方法:数値をポップしてプッシュし、オーバーフローする前にチェックする)
Https://leetcode-cn.com/problems/reverse-integer/solution/tu-jie-7-zheng-shu-fan-zhuan-by-wang_ni_ma/
2番目の方法は理解しやすく、常にモジュラス最後の数値を取得し、毎回オーバーフローするかどうかを判断します。

Pythonの実装

コードソース

class Solution:
    def reverse(self, x: int) -> int:
        res = 0
        x1 = abs(x)
        while(x1!=0):
            temp = x1%10 # 取末尾数字
            if res > 214748364 or (res==214748364 and temp>7):
                return 0 # 判断溢出
            if res<-214748364 or (res==-214748364 and temp<-8):
                return 0
            res = res*10 +temp
            x1 //=10 # 地板除,得到整数
        return res if x >0 else -res
        

008文字列変換整数(atoi)

ソース:LeetCode
リンク:https ://leetcode-cn.com/problems/string-to-integer-atoi

文字列を整数に変換するatoi関数を実装してください。
まず、関数は、最初の非スペース文字が見つかるまで、必要に応じて不要な開始スペース文字を破棄します。次の変換ルールは次のとおりです。

  • 最初の空白以外の文字が正または負の符号である場合は、この符号をその後のできるだけ多くの連続する数字と組み合わせて、符号付き整数を形成します。
  • 最初の空白以外の文字が数字の場合、次の連続する数字と直接結合されて整数を形成します。
  • 文字列には、有効な整数部分の後に余分な文字が含まれる場合もあるため、これらの文字は無視でき、関数に影響を与えることはありません。
  • 文字列の最初の非スペース文字が有効な整数文字でない場合、文字列が空であるか、文字列に空白文字のみが含まれている場合、関数を変換する必要はありません。つまり、効果的に変換できません。
  • いずれの場合も、関数が有効な変換を実行できない場合は、0を返します。

注意:

この質問の空白文字には、スペース文字 ''のみが含まれます。
私たちの環境が32ビットの符号付き整数しか格納できないと仮定すると、値の範囲は[-2 ^ 31、2 ^ 31 −1]です。値がこの範囲を超える場合は、2 ^ 31 −1または−2 ^ 31を返します。

入力:「42」出力:42

入力: "-42"出力:-42(-42の前にスペース_があることに注意してください)
説明:最初の非ブランク文字は、負の符号である「-」です。
マイナス記号を後続のすべての数字と組み合わせるように最善を尽くし、最終的に-42を取得します。

入力:「4193withwords」
出力:4193
説明:次の文字が数字ではないため、変換は数字「3」で終了します。

入力: "words and 987"
出力:0
説明:最初の空でない文字は「w」ですが、数字または正または負の符号ではありません。
そのため、効果的な変換ができません。

入力: "-91283472332"
出力:-2147483648
説明:数値 "-91283472332"は、32ビットの符号付き整数の範囲を超えています。
したがって、INT_MIN(-231)が返されます。

促す:

0 <= s.length <= 200
sは、英字(大文字と小文字)、数字、 ''、 '+'、 '-'、および 'で構成されます。

アイデア

参照質問ソリューション:https//leetcode-cn.com/problems/string-to-integer-atoi/solution/python-1xing-zheng-ze-biao-da-shi-by-knifezhu/は
主にPythonで正規表現を使用します

^:一致する文字列の先頭
[+-]:+文字または-文字を表し
ますか?:前の文字はオプションです
\ d:数字
+:前の文字の1つ以上
\ D:数字以外の文字
* :
範囲外防ぐために、前の文字の0以上のmax(min(number、2 ** 31-1)、-2 ** 31)

(ちなみに、マークダウン組版を学んだばかりのときに**太字の部分**を追加すると、\ escapingを追加して*記号を通常どおり表示できます)

成し遂げる

(正規表現yyds!)

class Solution:
    def myAtoi(self, s: str) -> int:
        return max(min(int(*re.findall('^[\+\-]?\d+', s.lstrip())), 2**31 - 1), -2**31)

ステップバイステップ

import re
class Solution:
    def myAtoi(self, str: str) -> int:
        INT_MAX = 2147483647    
        INT_MIN = -2147483648
        str = str.lstrip()      #清除左边多余的空格
        num_re = re.compile(r'^[\+\-]?\d+')   #设置正则规则
        num = num_re.findall(str)   #查找匹配的内容
        num = int(*num) #由于返回的是个列表,解包并且转换成整数
        return max(min(num,INT_MAX),INT_MIN)    #返回值
       

009回文

出典:LeetCode
リンク:https ://leetcode-cn.com/problems/palindrome-number

整数が回文であるかどうかを判別します。回文数は、正の順序(左から右)と逆の順序(右から左)の両方で同じ整数を参照します。
整数を文字列に変換せずにこの問題を解決できますか?

入力:121
出力:true

入力:-121
出力:false
説明:左から右に読み取ると、-121です。右から左に読むと121-です。したがって、それは回文ではありません。

入力:10
出力:false
説明:右から左に読み取ると、01です。したがって、それは回文ではありません。

アイデア

  • 最初にいくつかの状況を除外します。

すべての負の数を回文にすることはできません
.0を除いて、1の位が0であるすべての数は、最上位ビットが0に等しくないため、回文にすることはできません。
公式ソリューション

  • タイトルには文字列は必要ありません。モジュロを繰り返し取得して逆の数値を取得し、それを元の数値と比較することを検討できます。
    例えば、回文数は13531、rN:1→13→135、x:1353→135です。

  • 条件の分析:while x > revertedNumber

プロセス全体で、元の数値を10で除算し、次に反転した数値に10を乗算し続けるため、元の数値が反転した数値以下の場合は、半分の桁を処理したことを意味します。 。

回文であるかどうかに関係なく、反転桁数はn / 2以上でループを終了します。回文数は13531で、
135 = 135と判断され、1を返します。
非回文数は654321と判断され、123 <654、次回1234> 65、0を返します。

Pythonの実装

出典:https//leetcode-cn.com/problems/palindrome-number/solution/hui-wen-shu-by-leetcode-solution/436848
コメントは作成者によって追加されました。

class Solution:
    def isPalindrome(self, x: int) -> bool:
    	# 直接排除特殊情况
        if x < 0 or (x % 10 == 0 and x != 0):
            return False
          
        revertedNumber = 0 # 反转后的数字
        while x > revertedNumber:
            revertedNumber = revertedNumber * 10 + x % 10
            x //= 10 # 取整,取原数前n-1位
        return x == revertedNumber or x == revertedNumber // 10
		# 当数字长度为奇数时,通过 revertedNumber/10 去除处于中位的数字
		

おすすめ

転載: blog.csdn.net/cosima0/article/details/112545050