HackerRank – New Year Chaos by C#
測試案例
public static void minimumBribes(List<int> q)
{
var total =0;
for(int i = q.Count-1; i > 0; i--)
{
if (q[i-1] == i+1)
{
q[i-1] = q[i];
total++;
}
else if (i>=2 && q[i-2] == i+1)
{
q[i-2] = q[i-1];
q[i-1] = q[i];
total+=2;
}
else if (q[i] != i+1){
Console.WriteLine("Too chaotic");
return ;
}
}
Console.WriteLine(total);
}
這題老實說,很難看的懂...就算是看答案也一樣
基本上就是帶入程式研究一輪變化吧
首先 傳入的參數 2 1 5 3 4
一開始返向逐一抓值出來,因為假設是由排在後面的人往前做賄絡
順序就是4, 3, 2, 1, 0(index)
按index就是
index: 4, 3, 2, 1, 0
value: 4, 3, 5, 1, 2 這個順序來看
首先index=4時
先
判斷 q[3]若前一個等於5(i+1),代表可以經過換過了一次達成
但這個時候,並不是,這時的q[3]是3,判斷不符
value: 4, 3, 5, 1, 2
否則 再判斷q[2](i-2,表示前2個)是不是5,
結果符合:
value: 4, 3, 5, 1, 2
代表可以經由換2次做到5變成index=3的位置
所以試著做
第3個位置換回第4個位置
index: 4, 3, 2, 1, 0
value: 4, 5, 3, 1, 2
而第4個位置=第5個位置。
index: 4, 3, 2, 1, 0
value: 5, 4, 3, 1, 2
然後步驟+2;
再來index=3時
一樣做上述判斷
index: 4, 3, 2, 1, 0
value: 5, 4, 3, 1, 2
先看前一個q[2]等於4,結果不是
然後看q[1]前2個是否等於4,結果也不是
最後看,第3個是不是等於4,也不是。
這一輪結束
再來index=2時
index: 4, 3, 2, 1, 0
value: 5, 4, 3, 1, 2
若前一個q[1]是否等於3,結果不是
然後看 q[0]是否等於3,結果也不是
最後看,第2個是不是等於3,也不是
這一輪結束
再來index = 1時
index: 4, 3, 2, 1, 0
value: 5, 4, 3, 1, 2
若前一個q[0]是否等於2,結果符合
這時將 q[i-1] = q[i]
最後組合為
index: 4, 3, 2, 1, 0
value: 5, 4, 3, 2, 1
然後步驟++,此時步驟=3
結束>0的迴圈
印出 total=3;
這個迴圈裡的條件判斷就是假設從最後面一排往前看
若是可以透過假設一步換掉的話,就把他還原
假如可以透過 二步換掉的話,就也把他還原。
否則的話,若比較的值沒有出現在前1、2個位置也沒出現在原位的話,代表 最高可能要超過2步才能達成。所以就印出too chaotic
概念走訪如上...實際寫的話..可能要多記憶一下這個脈絡...XD
Reference :
https://www.youtube.com/watch?v=eFIYc7E4cmQ