1つのクイックメイン要素(10分)
タイトル内容:
プロセスの古典的な分割の有名な高速ソートアルゴリズム:我々は、通常、いくつかの方法を使用してメイン元以上の要素よりも主元の左側に入れて、交換して、(値)主成分として元素をとりその右に要素。所定の分割後の互いに異なるnは正の整数の配列は、PCA Iは、予め選択さに分割することができるどのように多くの要素を求めることができますか?
例えば、配置が与えられている[1、3、2、4、5]。その後:
- 1には要素、それはPCAかもしれないので、それは、大きいよりも右側の要素を残していません。
- 左側の要素3が、それは小さいが、それは主成分であることができないので、その右側2は、それよりも小さく、より。
- ;それは大きいですが、それは主成分であることができないので、それは、それよりも大きい3つ左より右の要素2が、
同様の理由で、図4および図5は、主要素である可能性が高いです。
従って、3つの要素は、主成分分析であってもよいです。
入力フォーマット:
整数の複数の行の配置は、スペースで区切ら
出力フォーマット:
1行目では、出力は、主要素の要素の数であってもよく、これらの要素は、2行目の昇順に出力され、隙間によって分離され、終了行の端部は、余分なスペースを有していなくてもよいです。
サンプル入力:
1 3 2 4 5
出力例:
3
1 4 5
問題解決のアイデア:
数を決定し、それは左の番号を確認することです、主要なコンポーネントではありません右の数字は例のみで一つの要素を考慮することが大きな注目を集め、一人で議論し、最後の要素、それはないよりも、それよりも小さいではありません
プログラムコード:
def prin_element(a):
b = []
if len(a) == 1:
b = a
else:
for i in range(1,len(a)-1):
if a[i] > max(a[:i]) and a[i] < min(a[i+1:]):
b.append(a[i])
if a[0] < min(a[1:]):
b.insert(0,a[0])
if a[-1] > max(a[:-1]):
b.append(a[-1])
print(len(b))
print(' '.join([str(i) for i in b]))
lst = list(map(int,input().split()))
prin_element(lst)
悪いの最初のバージョン2(10分)
タイトル内容:
同じ製品のバージョンのN数があり、その数は1からNまでの整数であり;それらのすべては、バージョンからバージョンが損傷された後。今考えると、機能isBadVersion、Nのデジタル入力は、(破損した場合、出力はTrue)のバージョンが損傷を受けることができるかどうかを判断し、破損の最初のバージョンを検索します。
注:最適化する方法を見つけるために時々isBadVersion機能がゆっくり走る、してください注意を払います
入力フォーマット:
二行
数Nの整数最初の行は、製品の総数であります
有効なPython式与えられ、与えられた第二の機能のふるまいを分析、評価を読み取るために使用することができます
出力フォーマット:
数字の列は、破損したバージョンを表し
サンプル入力:
50
ラムダN:N> = 30
出力例:
30
問題解決のアイデア:
破損したバージョンは、最初のバージョンが破損することも可能であるとき、ユースケース、時間制限は、二分法テイクは時に中間要素に検索速度、注意を払うをスピードアップします
プログラムコード:
N = int(input())
isBadVersion = eval(input())
def firstBadVersion(n):
first = 1
last = n
while first < last:
mid = (first + last) // 2
if isBadVersion(mid):
last = mid # 这里不能用mid-1,因为mid也有可能是第一个坏版本
else:
first = mid + 1
return first
print(firstBadVersion(N))
図3に示すように(10分)に挿入し、マージされています
タイトル内容:
次の定義を考えます:
挿入ソート徐々に順序付けられた出力シーケンスを生成する、いずれかで入力データ1を得るために、反復アルゴリズムです。各反復アルゴリズム入力シーケンスから採取された要素は、順序付けられたシーケンス内の正しい位置に挿入します。オーダー内のすべての要素になるまで反復がそう。
反復は、並べ替え、次のアクションをマージ:まず、Nの元のシーケンスは一つだけの要素が含まれている、と注文したマージの各反復2つの隣接する配列、注文最後まで一つだけのサブシーケンスを命じたとして、シーケンス。
今、元の配列とソートアルゴリズムによって生成された中間のシーケンスを与えられ、アルゴリズムは、ソートアルゴリズムのかどうか、あなたがどのような種類を決定しますか?
入力フォーマット:
数字の2列に等しいリストの長さに対応するスペースで区切ら
最初の行は順序付けられたリストを示し、2ライン目のリストは、ソートアルゴリズムのプロセスの中間段階であります
出力フォーマット:
第一の挿入ソートソート挿入を表す出力、ソートマージ、またはマージをソート最初の行で表され、次にランク付けアルゴリズム反復2行目の結果のシーケンスの出力。トピックは、各テストの結果が一意であることを確認してください。スペースで区切られた数字と、最初から最後まで線との間に余分なスペースを持っていないかもしれません
サンプル入力:
3 1 2 7 8 5 9 0 4 6
1 3 2 8 5 7 4 9 0 6
出力例:
マージソート
1 2 3 4 5 8 7 9 0 6
サンプル入力2:
3 1 2 8 7 5 9 4 6 0
1 2 3 4 7 8 9 5 4 6 0
出力サンプル2:
挿入ソート
1 2 3 5 7 8 9 4 6 0
問題解決のアイデア:
最初の観察を挿入すると、リストをソートし、リストがソートさもなければマージ、この機能は挿入ソートであるかどうかを決定することによって、正確に同じ種類のインサートの前方部分と、順序付けられたリストの前部ことがわかります
プログラムコード:
def check(lst1,lst2):
position = 0
for i in range(len(lst1)-1):
if lst2[i+1]<lst2[i]:
position = i+1
break
if lst1[position:] == lst2[position:]: # 判断是否为插入排序
lst2 = sorted(lst2[:position+1])+lst2[position+1:]
print('Insertion Sort')
print(' '.join([str(i) for i in lst2]))
else: # 否则为归并排序
cnt = 2
lst = lst2
while lst == lst2: # 对排序后的列表不断进行归并排序直到列表改变
lst = [sorted(lst2[i:i+cnt]) for i in range(0,len(lst2),cnt)]
lst = [num for sub_lst in lst for num in sub_lst]
cnt *= 2
print('Merge Sort')
print(' '.join([str(i) for i in lst]))
lst1 = list(map(int,input().split()))
lst2 = list(map(int,input().split()))
check(lst1, lst2)