首页 > 试题广场 >

请问第 n个喝这个饮料的人是谁?

[问答题]
【编程题】
S,小L,小P,小R和小H 五个人排队站在一个出售’克隆可乐’的自动贩卖机前 队伍中除了他们五个没有其他人 队形如下

S,小L,小P,小R,小H

队列的第一个人 (小S)买了一听可乐,喝下去后变成了两个小S!然后两个小S心满意足的站到了队伍的最后。此时队形变成了这样:

L,小P,小R,小H,小S,小S

然后队列中下一个人 (小L)也买了听可乐,喝下去后变成两个人,站到了队伍最后。以此类推。例如小P第三个喝了克隆可乐,之后队伍变成这个样子:

R,小H,小S,小S,小L,小L,小P,小P

请问第 n个喝这个饮料的人是谁?

a=['S','L','P','R','H']
n=int(input('第n个喝饮料的人:'))
if n==1:
    print(a[0])
else:
    for i in range(1,n):
        m=a[0]
        a.pop(0)
        a.append(m)
        a.append(m)
    print(a[0])

发表于 2018-03-20 23:03:04 回复(0)
分析:按照S L P R H 的顺序,第一轮为0-4;第二轮为5-14;第三轮为15-34.。。。每轮相隔分别是5,10,20.。。。

所以这是一个等比数列,设轮数为m ,则第一轮首个为0;第二轮首为5*2^0;第三轮首位5*(2^0+2^1);第四轮首位5*(2^0+2^1+2^2),依次类推。。
按照上述规律先找到n属与哪一轮,然后ceil(n-轮首-1)/轮,得到的数就是顺序,S L P R H 例如:得到5就是H
编辑于 2017-08-03 15:13:30 回复(0)
public static void main(String[] args) {
        LinkedList<String> linkedList = new LinkedList<>();
        linkedList.add("小S");
        linkedList.add("小L");
        linkedList.add("小P");
        linkedList.add("小R");
        linkedList.add("小H");
        int n=7;
        System.out.println("第"+n+"个喝饮料的是"+result(n,linkedList));
    }

    private static String result(int n, LinkedList<String> linkedList) {
        int now = 1;
        String result="";
        while (now <= n){
            String s = linkedList.removeFirst();
            result=s;
            linkedList.addLast(s);
            linkedList.addLast(s);
            now++;
            if (now>n){
                break;
            }
        }
        return result;
    }
结果:第7个喝饮料的是小S
发表于 2019-09-10 00:44:30 回复(0)
vararr=['S','L','P','R','H'],temp,count=0;
while(count!=n){
    temp=arr.shift();
    count++;
    arr.push(temp);
    arr.push(temp);
}
console.log( temp);

发表于 2018-03-31 15:17:11 回复(0)
function getPerson(arr,n){
var item;
for(var i=0;i<n;i++){
item=arr.shift();
arr.push(item);
arr.push(item);
}
return item;
}
var arr=['S','L','P','R','H'];
console.log(getPerson(arr,7));
发表于 2017-08-04 21:13:40 回复(0)
var arr=['S','L','P','R','H'],temp,count=0;
while(count!=n){
    temp=arr.shift();
    count++;
    arr.push(temp);
    arr.push(temp);
}
console.log( temp);

编辑于 2017-07-31 19:09:16 回复(0)
喝了n次饮料之后,取队列末尾的元素就是答案
var clone = function(Arr,n){
            while(n--){
                let node = Arr.shift();
                Arr.push(node);
                Arr.push(node); 
            }
            return Arr[Arr.length-1];
        }

发表于 2020-10-09 16:22:14 回复(0)
vararr=['S','L','P','R','H'],temp,count=0;
while(count!=n){
    temp=arr.shift();
    count++;
    arr.push(temp);
    arr.push(temp);
}
console.log( temp);

发表于 2020-08-28 19:12:55 回复(0)
function solve(n) {
    // 当成模拟题来做的
    var arr = ['S', 'L', 'P', 'R', 'H'];
    var i = 0;
    while (i < n - 1) {
        var c = arr.shift();
        arr.push(c, c);
        i++;
    }
    return '小' + arr[0];
}

发表于 2019-09-12 09:58:01 回复(0)
直接计算
int main()
{
    int n;
    cin >> n;
    string arr[] = { "S", "L", "P", "R", "H" };
    int index = 0;
    int count = 0;
    while ((count += pow(2, index) * 5) < n)
        index++;
    int nums = pow(2, index); // 第index次每人个数
    int res;
    int last = n - (count - nums*5); // 第index次排队,队首人数
    if (last == 0)
        res = 0;
    else
        res = ( last % nums ) == 0 ? (last/nums-1) : (last/nums);
    cout << arr[res] << endl;
    
    return 0; 
}

编辑于 2018-08-04 12:26:30 回复(0)
function find(n) {
var arr = ['S','L','P','R','H']
var temp
for(var i=0;i<n;i++) {
temp = arr.shift()
arr.push(temp)
arr.push(temp)
}
console.log(temp)
}

发表于 2018-03-31 20:19:06 回复(0)
function guessWho (n) {
    var arr = ['S', 'L', 'P', 'R', 'H'];
    var i = 0;
    var last = '';
    while(i < n) {
        last = arr.shift();
        arr.push(last);
        arr.push(last);
        i++;
    }
    return last;
}

发表于 2017-09-22 19:49:09 回复(0)
这是一个队列的题目,第一个元素从对头出列,变成两个元素从队尾入列,当整个过程执行n次时,求对头元素。
发表于 2017-09-12 08:18:10 回复(0)
function colco(n){			
			var a = ['s','l','p','r','h'];
			var firstN ;
			if(typeof n == 'number'){
				if(n ==0){return false;}
				else if(n>0){
				for(var i = 0; i < n; i++){
					firstN = a.shift();
					// a.splice(a.length-1,0,firstN,firstN);
					a.push(firstN,firstN);
				}
			console.log(firstN);
			}
		}
		}

发表于 2017-09-11 17:17:45 回复(0)
function who(let array=[S,L,P,R,H],let n) {//涉及ES6的变量默认值。
let selectName
for (let i=1,i<n,i++)
     {
      let temp = array.shift();//删除第一个元素,并返回他; let len = array.push(temp,temp);
      selectName=aray[0]
     }
return selectName;
}
发表于 2017-08-03 17:47:26 回复(0)

function N(n) {
    var arr =['S','L','P','R','H'];
    for (var i = 0; ; i++) {
        // 每次一个人都会加倍,也就类似于等比数列增长
        var updateN = n - Math.pow(2, i) * 5;
        if (updateN > 0) {
            n = updateN ;
        } else if (updateN === 0) {
            return arr[4];
        } else {
            let nth= Math.ceil(n / Math.pow(2, i)) - 1;
            return arr[nth]
        }
    }
}

发表于 2017-08-01 02:33:32 回复(0)
var arr = ['S','L','P','R','H'];
    function whoDrink(n,arr){
           while(n>1){
                 var who = arr.shift(0);
                 arr.push(who);
                 arr.push(who);
                 n--;
             }
             return arr[0];
    }
发表于 2017-07-30 17:11:24 回复(0)