股票交易日和二维数组打印这两道题就是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.根据频率构建哈弗曼树进行编码。将森林合并成一颗编码中定义的满树(所有的结点要么是树叶,要么有两个孩子,且字符都在孩子上,而从根节点到孩子结点路径的左右为该字符的二进制编码序列)。