「41のインタビューの質問オファー安全性を証明する」テーマ別のネットワークと連続正数列Sをプログラミングオフライン牛

私の個人的なマイクロチャネルのパブリック番号: Microstrong

マイクロチャネル公共番号ID: MicrostrongAI

マイクロチャネル公共番号説明:Microstrong(バウアー)学生は主に学習プロセスにおける機械学習、深い学習、コンピュータビジョン、インテリジェントな対話システム関連のコンテンツ、共有の研究ノートを学びます!あなたの注意を楽しみにして、一緒に進捗状況を学習の交換を歓迎します!

します。https://www.zhihu.com/people/MicrostrongAI/activitiesほとんど家にページを知っています

Githubにします。https://github.com/Microstrong0305

個人的なブログます。https://blog.csdn.net/program_developer

 トピックリンク:

https://www.nowcoder.com/practice/c451a3fd84b64cb19485dad758a55ebe?tpId=13&tqId=11194&tPage=3&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

件名の説明:

問題解決のアイデア:

(1)時間複雑ですO(N ^ {2})

ACコードがあります。

# -*- coding:utf-8 -*-

import math


class Solution:
    def FindContinuousSequence(self, tsum):
        if tsum == 0 or tsum == 1:
            return []
        mid_ceil = int(math.ceil(float(tsum) / 2))
        result_list = []
        for i in range(1, mid_ceil + 1, 1):
            temp_sum = 0
            for j in range(i, 0, -1):
                temp_sum += j
                if temp_sum == tsum:
                    temp_list = [k for k in range(j, i + 1, 1)]
                    result_list.append(temp_list)
        return result_list


if __name__ == "__main__":
    sol = Solution()
    print(sol.FindContinuousSequence(3))

(2)時間複雑ですO(N)

         私たちは、それぞれ、二つの数を最大値と最小値の大小順序を考慮することができます。まず、小さなが1に初期化し、大きなは2に初期化。sが小さいから大に配列より大きく、そして場合、値が小さいほど、すなわち小の値を増加させるために、シーケンスから除去することができます。小規模から大規模までのシーケンス場合、および以下のよりも、大きな配列は複数の数字が含まれているので、こと、増加させることができます。これは少なくとも二つのシーケンス番号でなければならないため、我々は/ 2まで小さな(1 + S)を大きくする必要があります。
         そして、すべての連続したシーケンス9ためには、例えば、我々は2に初期化し、大きな、1に初期化し、小さなを置きます。小さな及び大きな配列が{1,2}である間に、我々はより多くの数字を含む次のシーケンスをしたいので、この時点で、シーケンスは、9未満3。私たちは、大きな増加には、この時系列{1,2,3} 3を入れました。配列が6であるので、我々は次に4が大きくなる追加、依然として以下9以上であり、小型で大きな配列との間に介在し、また、{1,2,34}をなろう。配列は10と9よりも大きいので、我々は、シーケンス内のいくつかの番号に省略されている、我々は2が小さくなり、このときに得られた配列は{2,3,4}であり、そして配列正確9加えます。我々はそれをプリントアウトし、第一および連続したシーケンス9を発見しました。次に我々は、ビッグを追加前工程を繰り返し、そして9 {4,5}の第二の連続配列について見出すことができます。全体のプロセスは、以下の表に要約することができます。

表:連続プロセスを取得し9のシーケンスとして
ステップ 小さい 大きい シーケンス そして、シーケンス Sと比較すると 次のステップ
1 1 2 1,2 3 以下 ビッグ増加
2 1 3 1,2,3 6 以下 ビッグ増加
3 1 4 1,2,3,4 10 より大きい 小さな増加
4 2 4 2,3,4 9 等しいです シーケンス、増加の大きな保存
5 2 5 2,3,4,5 14 より大きい 小さな増加
6 3 5 3,4,5 12 より大きい 小さな増加
7 4 5 4,5 9 等しいです シーケンスの保存

    明確な問題解決のアイデアを形成した後、私たちは、コードを書き始めることができます。ここでは、参照コードはACがあります。

# -*- coding:utf-8 -*-
class Solution:
    def FindContinuousSequence(self, tsum):
        # write code here
        if tsum == 0 or tsum == 1 or tsum == 2:
            return []
 
        result_list = []
 
        mid = int((tsum + 1) // 2)
        array = [i for i in range(0, mid + 1)]
        small = 1
        big = 2
        temp_sum = array[small] + array[big]
        temp = [array[small], array[big]]
        while True:
            if temp_sum == tsum:
                temp_list = [t for t in temp]
                result_list.append(temp_list)
                if big < len(array) - 1:
                    big += 1
                    temp_sum = temp_sum + array[big]
                    temp.append(array[big])
                else:
                    return result_list
            if temp_sum > tsum:
                temp_sum = temp_sum - array[small]
                temp.remove(array[small])
                small += 1
            if temp_sum < tsum:
                if big < len(array) - 1:
                    big += 1
                    temp_sum = temp_sum + array[big]
                    temp.append(array[big])
                else:
                    return result_list
 
        return result_list

        上記のコードでは、連続した配列および小塗布技術を求めます。典型的には、我々は、連続ループシーケンスを使用するが、各操作の後考慮配列のシーケンスを取得し、図形のほとんどの動作の前には、単に数を増加または減少に比べて同じであるので、我々は、以前の缶かもしれませんそして、動作シーケンスとの塩基配列を求めました。これにより、コードの効率を向上させる、不要な操作を減らすことができます。

参照:

[1]は、ハイタオ「安全プランを証明します」。

公開された289元の記事 ウォンの賞賛1000年 ビュー120万+

おすすめ

転載: blog.csdn.net/program_developer/article/details/104745775