每週挑戰 303:Python 和 Perl 解決方案
Mohammad S. Anwar 的每週挑戰提供了定期的編碼練習。 下面介紹的我的解決方案最初是用 Python 編寫的,然後適用於 Perl。 這種雙重方法提高了編碼能力。
挑戰 303:解決方案
任務 1:產生偶數 3 位元整數
任務描述:
給定一個正整數列表,產生可以使用列表中的數字組成的所有唯一偶數 3 位整數。
Python 解:
此 Python 解決方案利用 itertools.permutations
函數有效產生所有可能的 3 位數組合。 集合用於保持唯一性。
<code class="language-python">from itertools import permutations def three_digits_even(ints: list) -> list: solution = set() for p in permutations(ints, 3): num_str = "".join(map(str, p)) num = int(num_str) if num >= 100 and num % 2 == 0 and num_str[0] != '0': solution.add(num) return sorted(list(solution))</code>
Perl 解:
Perl 等效項使用 Algorithm::Permute
模組進行排列和雜湊以確保唯一性。
<code class="language-perl">use Algorithm::Permute; sub three_digits_even { my @ints = @_; my %seen; my @result; my $p = Algorithm::Permute->new(\@ints, 3); while (my @perm = $p->next) { my $num_str = join('', @perm); my $num = $num_str; if ($num >= 100 and $num % 2 == 0 and $num_str !~ /^0/) { push @result, $num unless $seen{$num}++; } } return sort {$a <=> $b} @result; }</code>
範例:
<code># Python print(three_digits_even([2, 1, 3, 0])) # Output: [102, 120, 130, 132, 210, 230, 302, 310, 312, 320] print(three_digits_even([2, 2, 8, 8, 2])) # Output: [222, 228, 282, 288, 822, 828, 882] # Perl print "@{[three_digits_even(2, 1, 3, 0)]}\n"; # Output: 102 120 130 132 210 230 302 310 312 320 print "@{[three_digits_even(2, 2, 8, 8, 2)]}\n"; # Output: 222 228 282 288 822 828 882</code>
任務 2:刪除並賺取
任務描述:
給定一個整數數組,透過重複刪除一個元素,獲得其值,然後刪除所有值比被刪除元素少一和多一的元素,找到你可以獲得的最大分數。
Python 解:
此 Python 解決方案使用 Counter
來追蹤元素頻率,並採用遞歸函數來探索不同的刪除策略。
<code class="language-python">from collections import Counter def delete_and_earn(ints: list) -> int: freq = Counter(ints) return max_score(freq) def max_score(freq: Counter) -> int: max_points = 0 for num in list(freq): # Iterate through a copy to safely delete points = num * freq[num] new_freq = freq.copy() del new_freq[num] if num - 1 in new_freq: del new_freq[num - 1] if num + 1 in new_freq: del new_freq[num + 1] max_points = max(max_points, points + (0 if not new_freq else max_score(new_freq))) return max_points</code>
Perl 解:
Perl 解反映了 Python 方法,使用雜湊進行頻率計數和遞歸函數。
<code class="language-perl">sub delete_and_earn { my %freq = map { $_ => 1 + $freq{$_} // 0 } @_; return max_score(\%freq); } sub max_score { my $freq = shift; my $max_points = 0; foreach my $num (keys %$freq) { my $points = $num * $freq->{$num}; my %new_freq = %$freq; delete $new_freq{$num}; delete $new_freq{$num - 1}; delete $new_freq{$num + 1}; $max_points = max($max_points, $points + (0 || max_score(\%new_freq))); } return $max_points; } sub max { return shift if @_ == 1; return $_[0] > $_[1] ? $_[0] : $_[1]; }</code>
範例:
<code># Python print(delete_and_earn([3, 4, 2])) # Output: 6 print(delete_and_earn([2, 2, 3, 3, 3, 4])) # Output: 9 # Perl print delete_and_earn(3, 4, 2), "\n"; # Output: 6 print delete_and_earn(2, 2, 3, 3, 3, 4), "\n"; # Output: 9</code>
這些解決方案展示了解決每週挑戰 303 中這兩項任務的高效且清晰的方法。 Python 和 Perl 的使用凸顯了演算法問題解決在不同程式語言之間的可移植性。
以上是用 igt 賺錢的詳細內容。更多資訊請關注PHP中文網其他相關文章!