1. 程式人生 > >美團——股票交易日、二維陣列列印、奇數位丟棄、字元編碼(哈弗曼編碼)

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

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