プログラミング演習@9-5

トピック 1:

タイトル 説明
入力文字列配列を解析し、文字列内のタイムスタンプ情報を抽出し、文字列をタイムスタンプで並べ替えて、コンソールに出力します。

説明を入力してください

1 行目は配列のサイズを指定し、2 行目から n 行目までは各行が独立した文字列で、n はサイズの値です。
各行の文字列は、「/-:」と文字と数字で構成されています。文字列内のタイムスタンプの位置は不明です。タイムスタンプの形式は、2019-01-01T07:30:20 で、1 月 1 日を意味します。 , 2019. 7:30:20 は 24 時間形式です。

出力の説明

入力文字列をタイムスタンプの小さい順に並べ替えた後、出力します。次の規則に従います: 1. タイムスタンプ情報が同じ場合は、文字列の長さに応じて小さい順にソートします;
2. 長さが同じ場合は、先頭文字から ASCII コード値を比較し、小さいものから大きいものへ並べ替える; 3. 2 つの場合 2 つの文字列がまったく同じである場合、出力する必要があるのは 1 つだけです。

例 1
入力

5
my/2019-01-01T09:00:01
my/2019-01-01T09:00:01
abc/2018-12-24T08:00:00/test/you
1/2018-12-24T08:00:00/テスト/テスト
1 123/2018-12-24T08:00:09/テスト/私

出力

1/2018-12-24T08:00:00/test/Test1
abc/2018-12-24T08:00:00/test/you
123/2018-12-24T08:00:09/test/me
my/2019-01 -01T09:00:01

size = int(input())
timestamps = []
for _ in range(size):
    timestamps.append(input())

def custom_sort(timestamp):
    parts = timestamp.split("/")
    ts_index = None
    for i, part in enumerate(parts):
        if "-" in part and "T" in part:
            ts_index = i
            break
    if ts_index is not None:
        ts = parts[ts_index]
        return (ts, len(timestamp), timestamp)
    else:
        return (timestamp, len(timestamp), timestamp)

sorted_timestamps = sorted(timestamps, key=custom_sort)

unique_timestamps = []
for ts in sorted_timestamps:
    if ts not in unique_timestamps:
        unique_timestamps.append(ts)

for ts in unique_timestamps:
    print(ts)
1/2018-12-24T08:00:00/test/Test1
abc/2018-12-24T08:00:00/test/you
123/2018-12-24T08:00:09/test/me
my/2019-01-01T09:00:01

トピック 2:

タイトル説明
すべて小文字の非常に長い英単語の列がありますが、k 以上の長さの単語が合計で何回出現するかを数え、最も出現頻度の高い単語を出力してください。
解が複数ある場合は長さが小さい方を出力し、長さが同じ場合は辞書順が小さい方を出力します。

入力の説明
タイトルにあるように、最初の行は整数 K です。
2 行目は文字列 str で、小文字のみが含まれており、長さは指定されていません。
k<=50
len(str)<=100000

出力の説明
1 行に 1 つの文字列。これは、長さが h 以上で頻度が最も高い文字列を意味し、解がない場合は -1 が出力されます。

例1

输入
2
abababababa

出力
ab

import collections

# 输入K和字符串str
K = int(input())
str = input()

# 获取字符串的长度
str_length = len(str)

# 初始化结果列表
words = []

# 遍历字符串,切割成所有长度大于等于K的子串
for i in range(str_length):
    for j in range(i + K, str_length + 1):
        substr = str[i:j]
        words.append(substr)

# 创建一个字典来存储单词和它们的出现次数
word_count = collections.defaultdict(int)

# 统计长度大于等于K的单词出现次数
for word in words:
    word_count[word] += 1

# 找到出现频率最高的单词
if word_count:
    print(min(word_count, key=lambda x: (-word_count[x], len(x), x)))
else:
    print(-1)
ab

トピック 3:

タイトル説明
バイナリ ツリーのルート ノード ルートを考えると、ツリーのノード値はすべて 0 ~ 9 の数値であり、ルート ノードからリーフ ノードまでの各パスは数値で表すことができます。
1 この質問のパスは、ツリーのルート ノードからリーフ ノードまでのノードとして定義されています
2 リーフ ノードとは、子ノードのないノードを指します 3.
パスは親ノードから子ノードへのみ進むことができます子ノードからではなく、親ノード
4 へのノードの総数は n です


入力
1
↙ ↘
2 3
出力
25

説明:
たとえば、ルートノードからリーフノードへのパスが 1->2->3 である場合、このパスは 123 に置き換えられます。ルート ノードからリーフ ノードまでのすべてのパスによって表される数値の合計を求めます。たとえば、このバイナリ ツリーにはルート ノードからリーフ ノードへの合計 2 つのパス 1->2 があります。ルート ノードからリーフ ノードへのパスを置き換えるために数値 12 が使用されます。1->3 は次のように置き換えられます。数字は 13 なので、答えは 12+13=25 となります。

# 原题是核心代码模式
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def sumNumbers(root):
    def dfs(node, current_sum):
        if not node:
            return 0

        # 计算当前路径上的数字之和
        current_sum = current_sum * 10 + node.val

        # 如果是叶子节点,返回当前路径的数字之和
        if not node.left and not node.right:
            return current_sum

        # 否则,递归计算左子树和右子树的路径数字之和,并相加
        return dfs(node.left, current_sum) + dfs(node.right, current_sum)

    return dfs(root, 0)

# 创建示例二叉树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)

# 计算根节点到叶子节点的所有路径表示的数字之和
result = sumNumbers(root)
print(result)
25

おすすめ

転載: blog.csdn.net/cjw838982809/article/details/132701989