Ruby - Hackerrank Puzzle - 拯救囚犯

时间:2016-07-06 03:00:39

标签: ruby

我很难理解如何在不引起内存分配问题的情况下解决此问题。我很确定我的逻辑是合理的,但不幸的是,这似乎并不够好。有没有人对此有任何建议,所以我可以理解如何更有效地编写代码?

问题在于: 样本输入: 1 5 2 1 样本输出 2 有N = 5名囚犯和M = 2名儿童。分发从ID号S = 1开始,因此囚犯1获得第一个甜蜜,囚犯2获得第二个(最后)甜蜜。因此,我们必须向囚犯发出关于毒药的警告,所以我们在新线上打印2。

# Enter your code here. Read input from STDIN. Print output to STDOUT
n = gets.strip.to_i
n.times do 

arr = gets.strip.split(" ").map { |s| s.to_i}
prisoners = arr[0].to_i
sweets = arr[1].to_i
position = arr[2].to_i
    prisoners_array = (1..prisoners).map { |p| p.to_i}
    starting_position = prisoners_array[position - 1]
    end_position = prisoners_array.size

    awesome_array = (starting_position..end_position).map { |p| p.to_i}
    awesomer_array = (prisoners_array[0]...starting_position).map { |p| p.to_i}
    awesomest_array = awesome_array + awesomer_array

warning = 0

    if sweets > prisoners
        sweets = sweets % prisoners
    end
    for i in awesomest_array

    warning += 1
        if warning === sweets
            puts prisoners_array[i - 1] 
        end
end
end

2 个答案:

答案 0 :(得分:2)

This appears to be有问题的练习。这里的关键是管理你使用模数(计算0索引位置)和问题(使用1索引位置)。

在示例中,我们有 5人(n),并希望从 person#1(s)开始,对 2个位置(m)进行迭代)即可。人#1是索引位置0,我们通过从s中减去一个来计算。我们还必须从行进距离t中减去一个,因为到达起始位置被认为是第一步。我们有s+m-2

通过得到这个结果数,以%为总人数,我们将计算出我们最终得到的0指数位置。我们需要向这个数字添加一个以转换回1索引系统。

虽然可以采用长形式的方法解决锻炼问题(例如通过填充数组并实际迭代它们),但这个问题也可以解决如下:

# Enter your code here. Read input from STDIN. Print output to STDOUT
gets.strip.to_i.times do
    # n - number of prisoners
    # m - number of sweets
    # s - starting id
    n, m, s = gets.split.map &:to_i
    puts ((m+s-2) % n) + 1
end

答案 1 :(得分:0)

new CountDownTimer(6000, 1000) {

    public void onTick(long millisUntilFinished) {
       // do every 1 second
    }

    public void onFinish() {
        // show your toast after 6 seconds.
    }

}.start();