算法里面有些题挺不错,会提到一些应用场景,比如这个前移编码策略就有点生动:
算法的实现倒并不复杂,就是链表的应用。链表查询,删除,增加操作。算法介绍应用场景,就会让人印象比较深刻。再比如前面的环形缓冲区问题:
环形缓冲区问题--《算法》1.3.39_自觉的数字公民杨某某的博客-CSDN博客
里面提到这个环形缓冲区和生产消费者线程协作模型对于异步数据传输或者日志记录场景很有用。
回到这个前移编码策略模拟。
方法:
1、字符串的输入与处理-java方式的,尝试了几个,最后用了Scanner输入一行字符串,然后用CharAt取字符。
2、然后建链表的头,在这之前定义一个存储数据的类型node
3、API只有一个方法,就是怎么增加。按照题目要求先遍历链表,然后不管是不是找到,都增加在表头,如果找到,还要把那个删除。
代码的实现:
1、类型node部分:
class CharNode{ char aChar; CharNode next; public CharNode(){ } public CharNode(char achar){ this.aChar = achar; this.next = null; } }
2、链表部分
private CharNode head; public MoveToFront(){ this.head = new CharNode(); } public void add(char newchar){ CharNode temp ; CharNode find_node = null; if(head.next == null){ CharNode charNode = new CharNode(newchar); head.next = charNode; } temp = head; while(temp.next!= null){ if(temp.next.aChar == newchar) { find_node = temp.next; temp.next = find_node.next; find_node.next = head.next; head.next = find_node; break; } temp = temp.next; } if(find_node==null){ find_node = new CharNode(newchar); find_node.next = head.next;//abccdgak. head.next = find_node; } }
3、测试部分:
public static void main(String[] args) { MoveToFront moveToFront = new MoveToFront(); Scanner scanner = new Scanner(System.in); String newline = scanner.nextLine(); System.out.println(newline); for(int i = 0 ; i < newline.length(); i++) { char c = newline.charAt(i); moveToFront.add(c); CharNode temp = moveToFront.head.next; System.out.print("update: "); while(temp != null){ System.out.print(temp.aChar); temp = temp.next; } System.out.println(); } }
4、测试结果:
abccdgak.
abccdgak.
update: a
update: ba
update: cba
update: cba
update: dcba
update: gdcba
update: agdcb
update: kagdcb
update: .kagdcb