牛客网--2016--美团奇数位丢失

来源:互联网 发布:linux安装tgz文件 编辑:程序博客网 时间:2024/06/06 03:34

有些事情,记着记着就忘了,有些人,爱着爱着就变了,有些坚持,做着做着就停了。
很气,好气哦,为什么玩游戏可以坚持下去,而这个坚持总会忘掉。


题目:
对于一个由0..n的所有数按升序组成的序列,我们要进行一些筛选,每次我们取当前所有数字中从小到大的第奇数位个的数,并将其丢弃。重复这一过程直到最后剩下一个数。请求出最后剩下的数字。
输入:
每组数据一行一个数字,为题目中的n(n小于等于1000)。
输出:
一行输出最后剩下的数字。
解析:
这个想法无敌了。。。。
因为是从0开始,所以第一轮移走的是二进制下最右边为0的位置(从0开始的偶数位置)上的数,然后我们发现第二轮各个number的位置等于number/2,即从number位置到number>>1位置,这时候我们依然移走二进制下最右边为0的位置(1(01) 5(101) 9(1001) ……它们第二轮对应的位置是0, 2, 4),最后剩一个数肯定是0到n中二进制下1最多的那个数,因为它每次的位置都是奇数位置。代码如下
解题所需函数:
代码:

// 这个c++没的说#include <cstdio>int main(){    int n;    while(scanf("%d", &n) != EOF){        int b = 1;        while(b < n){            b <<= 1;        }        printf("%d\n", (b >> 1) - 1);    }    return 0;}// java方法简单易懂,实质上就是使用了单向链表的功能import java.util.Scanner;public class Main{    // 创建Node类,用于记录下一个节点和当前节点信息    static class Node{        int index;        Node next;    }    public static void main(String[] args) {        Scanner in  = new Scanner(System.in);        while(in.hasNext()){            int n = in.nextInt();            Node root = new Node();            root.index = 0;            Node temp = root;            //初始化 第一个结点            for(int i = 1;i<=n;i++){                // 创建新的节点并且                Node node = new Node();                node.index = i;                temp.next = node;                temp = node;            }            temp = root.next;//删除第一个            root = temp;            while(root.next!=null){                // 当前为空或者tmep下一位为空,那么重新删除第一个                if(temp==null||temp.next==null){                    temp = root.next;//删除第一个                    root = temp;                }else{                    // 跨一位赋值                    Node nextTemp = temp.next.next;                    temp.next = nextTemp;                    // 设定当前变量                    temp = nextTemp;                }            }            // 当且仅当只有一个数据的时候            System.out.println(root.index);        }    }}
原创粉丝点击