第11回ブルーブリッジカップPythonグループテストの質問への回答

第11回ブルーブリッジカップPythonグループテストの質問への回答

家番号作成

ここに画像の説明を挿入します

この質問の意味は[1、2020]の間のすべての数値の中で数値2の中心を見つけることですこれは閉区間であることに注意してください)。
つまり、1から始めて、2を含む数を見つけ、この数に2がいくつあるかを確認します。

たとえば、2021は2つの2に貢献します。

方法1:デジタル分離

count = 0

for i in range(1, 2021):
    n = i
    while n != 0:
        m = n % 10
        n = n // 10
        if m == 2:
            count += 1

print(count)
# 624

方法2:文字列を強制的に変換する

count = 0

for i in range(1, 2021):
    count += str(i).count('2')

print(count)
# 624

2020年を探しています

ここに画像の説明を挿入します

データは、300行300列のデータを含むtxtファイルであり、すべて番号0と2です。このtxtファイルは公式ウェブサイトなどで見つからなかったので、サンプルデータでテストしてみましょう。

220000
000000
002202
000000
000022
002020

注:ファイルから読み取られるデータはすべて文字列です。

def check_s(s):
    return s == '2020'


data = []
# test.txt
# 220000
# 000000
# 002202
# 000000
# 000022
# 002020

# 读取数据
with open('test.txt', mode='r', encoding='utf-8') as fp:
    for line in fp:
        line = list(line.strip())
        data.append(line)

print(data)
# 读出来的全是字符串
# [['2', '2', '0', '0', '0', '0'], 
#  ['0', '0', '0', '0', '0', '0'], 
#  ['0', '0', '2', '2', '0', '2'], 
#  ['0', '0', '0', '0', '0', '0'], 
#  ['0', '0', '0', '0', '2', '2'], 
#  ['0', '0', '2', '0', '2', '0']]

m, n = len(data), len(data[0])
count = 0

for i in range(m):
    for j in range(n):
        # 行
        if i + 3 < n and check_s(data[i][j] + data[i+1][j] + data[i+2][j] + data[i+3][j]):
            count += 1
        # 列
        if j + 3 < m and check_s(data[i][j] + data[i][j+1] + data[i][j+2] + data[i][j+3]):
            count += 1
        # 斜
        if i + 3 < n and j + 3 < m and check_s(data[i][j] + data[i+1][j+1] + data[i+2][j+2] + data[i+3][j+3]):
            count += 1

print(count)
# 5

発散的思考:文字列のcount()関数を使用して処理することを検討してください。各行と列の文字列は読みやすく、line.count( '2020')を使用して文字列の行数を取得します。文字列は「2020」ですが、対応する文字列を斜めに出す良い方法はありません。時間があれば更新します。あなたは良い方法を思い付くことができるコメントエリアにコメントを残すことができます。

ランニングエクササイズ

ここに画像の説明を挿入します

Python標準ライブラリdatetimeのdatetimetimedeltaweekdayを直接使用することで簡単に取得できます。キーポジションが分析されました。

import datetime

distances = 0
start_time = datetime.datetime(year=2000, month=1, day=1)  # 2000年1月1日00:00 周六
dela = datetime.timedelta(days=1)
end_time = datetime.datetime(year=2020, month=10, day=1)  # 到2020年10月2日00:00 这样包括10月1号 周四
time = end_time - start_time  # time为一个timedelta对象
# start_time.weekday() 返回数字0-6,0代表星期一,依次类推  5 代表星期六

while start_time <= end_time:
    if start_time.day == 1 or start_time.weekday()  == 0:
        # 月初或周一
        distances += 2
    else:
        distances += 1
    start_time += dela

print(distances)  # 8879

ヘビの皮膚の歩行位置

ここに画像の説明を挿入します

手作業で計算することをお勧めします。非常に高速です。コードを使用することは不可能ではありません。私は最近とても忙しいです。私の個人的なウェブサイトhttp://47.116.137.43/がまもなく立ち上げられます。ドメイン名liboer.topは、ファイリング中にドメイン名としてアクセスできず、CDNアクセラレーションは行われていません。最初の訪問の読み込みは少し遅くなります。ようこそ。誰もが訪問しています。手動計算方法ですが、コードについては時間のあるときに追加できますので、コメント欄に追加していただければ幸いです。
問題を解決するというアイデア。
累積数はn(n + 1)/ 2ずつ増加しますが、最終的な数は奇数列と偶数行に分割されます。例:3の3列の最初の数字は3(3 + 1)/ 2 = 6で、4行目の最初の数字は4(4 + 1)/ 2 = 10です。したがって、20行20列の数字が対角数であることを知る必要があります。対称であることがわかります。したがって、20列目の右側に(20-1)= 19列があるため、39列目の最初の数値は、20行20列目の最後の数値になります。39は奇数なので、39(39 + 1)/ 20 = 780 780と余分な(39-20)= 19の数値が減算されるため、最終結果は780-19 = 761になります。
私の問題解決手順
ここに画像の説明を挿入します

ソート

ここに画像の説明を挿入します

バブルソート
条件:
隣接する交換が100回行われ、小文字のみが繰り返されず、辞書の最短順序が最小になります。まず、隣接する交換、小文字のみ、繰り返しなし、最短が事前に判断され、順序が直接逆になります。最短の文字列はほとんどの場合交換できるからです。交換回数がn(n-1)/ 2であることは簡単にわかります。n= 15の場合、すべての逆順を105回交換できます。
つまりonmlkjihgfedcba、105回
交換、現在は100交換なので、このo nmlkjoihgfedcbaを考えるのは簡単です。これは100回です。
ただし、条件を見てください辞書式順序が最小であるため、最小のものをできるだけ左に移動します。さらに5回、最後に5番目の文字jを置くので、jonmlkihgfedcba、各交換は5分の1に移動し、jに達すると最終的に逆の順序に戻ります。
例:
jonmlkihgfedcba最後にoを付けて、jnmlkihgfedcbaoを取得しますonmlkjihgfedcbaと比較して、最後oを付けるのは1回少なくなります
。nmlkjihgfedcbaojnmlkihgfedcbaojmlkihgfedcbanoを取得するために最後にnを置くことを意味しますnmlkjihgfedcbaoと比較して、最後nを付けるのは1回少なくなり
ます...
jonmlkihgfedcbaからjihgfedcbaklmnoまで正確に5倍少なく、5回後にonmlkjihgfedcbajihgfedcbaklmnoになり、すべてが同じになります。
結果:jonmlkihgfedcba

コードの説明

def bubbl_sort(alist, count):
    for i in range(len(alist) - 1):
        for j in range(len(alist) - 1 - i):
            if alist[j] > alist[j+1]:
                count += 1
                alist[j], alist[j+1] = alist[j+1], alist[j]
        print(alist)
    return (alist, count)

count = 0
print(bubbl_sort(list('jonmlkihgfedcba'), count))


# 每趟循环结果
['j', 'n', 'm', 'l', 'k', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a', 'o']
['j', 'm', 'l', 'k', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a', 'n', 'o']
['j', 'l', 'k', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a', 'm', 'n', 'o']
['j', 'k', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a', 'l', 'm', 'n', 'o']
['j', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a', 'k', 'l', 'm', 'n', 'o']
['i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a', 'j', 'k', 'l', 'm', 'n', 'o']
['h', 'g', 'f', 'e', 'd', 'c', 'b', 'a', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
['g', 'f', 'e', 'd', 'c', 'b', 'a', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
['f', 'e', 'd', 'c', 'b', 'a', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
['e', 'd', 'c', 'b', 'a', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
['d', 'c', 'b', 'a', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
['c', 'b', 'a', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
['b', 'a', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']


(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o'], 100)


おすすめ

転載: blog.csdn.net/qq_31910669/article/details/114843073
おすすめ