Bootstrap

美团——股票交易日、二维数组打印、奇数位丢弃、字符编码(哈弗曼编码)

股票交易日和二维数组打印这两道题就是time to sell stock和蛇形矩阵。


   

题目奇数位丢弃:(关于LinkedList和listIterator的使用)

对于一个由0..n的所有数按升序组成的序列,我们要进行一些筛选,每次我们取当前所有数字中从小到大的第奇数位个的数,并将其丢弃。重复这一过程直到最后剩下一个数。请求出最后剩下的数字。
输入描述:
每组数据一行一个数字,为题目中的n(n小于等于1000)。
输出描述:
一行输出最后剩下的数字。
输入例子:
500
输出例子:
255

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        while(in.hasNext()){
            int n=in.nextInt();
            LinkedList<Integer> list=new LinkedList();
            for(int i=0;i<=n;i++){
                list.add(i);
            }
            while(list.size()!=1){
                Iterator<Integer> it=list.listIterator(0);//使用迭代器遍历并删除元素
                int index=1;
                while(it.hasNext()){
                    Integer temp=it.next();
                    if(index%2 == 1){
                        it.remove();
                    }
                    index++;
                }
            }
            System.out.println(""+list.peekFirst());
        }
        in.close();
    }
}

题目描述:字符编码

请设计一个算法,给一个字符串进行二进制编码,使得编码后字符串的长度最短。
输入描述:
每组数据一行,为待编码的字符串。保证字符串长度小于等于1000。
输出描述:
一行输出最短的编码后长度。
输入例子:
MT-TECH-TEAM
输出例子:
33
解析:利用哈弗曼编码规则进行编码,并返回编码后的长度。哈弗曼编码是前缀码,即字符编码长度不相同,但是 没有字符代码是别的字符代码的前缀

哈弗曼编码步骤:

1.搜集数据频率;

2.根据频率构建哈弗曼树进行编码。将森林合并成一颗编码中定义的满树(所有的结点要么是树叶,要么有两个孩子,且字符都在孩子上,而从根节点到孩子结点路径的左右为该字符的二进制编码序列)。







;