美團——股票交易日、二維數組打印、奇數位丟棄、字符編碼(哈弗曼編碼)

股票交易日和二維數組打印這兩道題就是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.根據頻率構建哈弗曼樹進行編碼。將森林合併成一顆編碼中定義的滿樹(所有的結點要麼是樹葉,要麼有兩個孩子,且字符都在孩子上,而從根節點到孩子結點路徑的左右爲該字符的二進制編碼序列)。







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章