假設您有這樣一個序列:0,1,2,3,4,5,6,7,0,1,2等。基本上由N個數字組成的序列,重複一遍又一遍。循環序列中兩個數字之間的距離
尋找這個序列中兩個數字之間的距離/差異的最簡單算法是什麼?例如距離from 5 to 7 is +2
和距離from 0 to 6 is -2
。對於更高層次的觀點,我有一個循環/重複序列號,我需要找出最近路徑上的另一個數字「之前」或「之後」的數量(它們之間的最小數目)。
假設您有這樣一個序列:0,1,2,3,4,5,6,7,0,1,2等。基本上由N個數字組成的序列,重複一遍又一遍。循環序列中兩個數字之間的距離
尋找這個序列中兩個數字之間的距離/差異的最簡單算法是什麼?例如距離from 5 to 7 is +2
和距離from 0 to 6 is -2
。對於更高層次的觀點,我有一個循環/重複序列號,我需要找出最近路徑上的另一個數字「之前」或「之後」的數量(它們之間的最小數目)。
假設X> Y:對於N
dist(X, Y) = min { X-Y, N-(X-Y-1) }
示例= 7:
DIST(7,5)= {分鐘7-5,7-(7-5-1)} =分{2,6} = 2
DIST(6,0)= {分鐘6-0,7-(6-0-1)} = {分鐘6,2} = 2
DIST( 5,1)= min {5-1,7-(5-1-1)} = min {4,4} = 4
最後一個示例指出了距離定義中的一個小缺陷:dist(5,1)= 4還是dist(5,1)= -4?我已經改變了你的定義,以避免負距離(所以我的算法計算距離的絕對值)。如果你想保持你的定義,那麼當且僅當min
的第一個參數大於第二個參數時,使距離爲負。
這是非常簡單的工作與連續和非連續的數字,也許讓一個擴展方法:
[TestFixture]
public class NumbersFixture
{
[Test]
public void FindDistance()
{
var numbers = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2 };
var num1 = 6;
var num2 = 0;
var from = numbers.IndexOf(num1);
var indexFound = numbers.FindIndex(from, f => f == num2);
var distance = from - indexFound;
var result = string.Format("{0}", distance);
Console.WriteLine(result);
}
}
你嘗試過什麼。迭代時,您發現number1不斷迭代距離計數器。如果你發現number2,那麼你有距離。如果您發現number1,則重置距離計數器。保存最小距離計數器。對於 - 只需切換這兩個數字。 – Paparazzi
我正在尋找快速的方式,我提出的最佳方式是:'n =(from + size) - to;如果n>大小/ 2然後n - =大小'但它涉及一個分支 – thr
是數字總是連續的?我剛剛意識到我看到了一個更復雜問題的答案 –