问题1:
有两个房间,一间房里有三盏灯,另一间房有控制着三盏灯的三个开关,
这两个房间是分割开的,从一间里不能看到另一间的情况。
现在要求受训者分别进这两房间一次,然后判断出这三盏灯分别是由哪个开关控制的。
有什么办法呢?
分析:
灯泡和开关的问题。三个灯泡、三个开关,要在灯泡和开关之间建立对应关系。使用一条准则,一个灯泡可以关联一个开关。再使用一条准则,又一个灯泡可以再关联一个开关。那么,最后剩下的灯泡就必然和剩下的开关对应。因此,只要找到两条判断的依据即可。依据1:当前灯泡的亮灭。依据2:亮过的灯泡会发热。
1.先走进有开关的房间,将三个开关编号为a b c。
2.将开关a 打开5分钟,然后关闭,然后打开b
问题2:
你让一些人为你工作了七天,你要用一根金条作为报酬。金条被分成七小块,每天给出一块。
如果你只能将金条切割两次,你怎样分给这些工人?
分析:
1+2+4;
两刀分金条。共7天,每天给1/7。
第一天从金条上切1/7支付给工人。
第二天从金条上切2/7,这时剩下4/7。支付2/7给工人,收回1/7。
第三天将收回的1/7支付给工人
第四天将4/7支付给工人,并将1/7、2/7收回
...
问题3:
★用一种算法来颠倒一个链接表的顺序。现在不用递归式的情况下做一遍。
class LinkedListIT8{ static class Node{ int data; Node next; Node(int x, Node n){ data = x; next = n; } } private Node head; private Node tail; private int theSize; LinkedListIT8(){ head = new Node(-1, null); tail = new Node(-1, null); head.next = tail; theSize = 0; } public int size(){ return theSize; } public void add(int x){ addAfter(getNode(size()), x); } private void addAfter(Node p, int x){ Node newNode = new Node(x, p); newNode.next = p.next; p.next = newNode; theSize++; } private Node getNode(int idx){ Node p = head; for (int i = 0; i < idx; i++) p=p.next; return p; } public void printList(){ Node p = head.next; for (int i = 0; i < size(); i++) { System.out.print(p.data + " "); p = p.next; } } public void reverse(){ //reverseR(head); reverseNR(head); } private Node reverseR(Node currentNode){ if(currentNode == tail) { head = currentNode; } else { reverseR(currentNode.next).next = currentNode; } return currentNode; } private void reverseNR(Node phead){ Node pre = head; Node cur = head.next; Node np; while(cur != tail){ np = cur.next; cur.next = pre; pre = cur; cur = np; } head = cur; cur.next = pre; tail = phead; tail.next = null; } } public class IT8 { public static void main(String[] args) { LinkedListIT8 ll = new LinkedListIT8(); ll.add(0);ll.add(1);ll.add(2);ll.add(3); ll.add(4);ll.add(5);ll.add(6);ll.add(7); ll.printList(); ll.reverse(); System.out.println("\n***************"); ll.printList(); } }
★用一种算法在一个循环的链接表里插入一个节点,但不得穿越链接表。
★用一种算法整理一个数组。你为什么选择这种方法?
★用一种算法使通用字符串相匹配。
★颠倒一个字符串。优化速度。优化空间。
★颠倒一个句子中的词的顺序,比如将“我叫克丽丝”转换为“克丽丝叫我”,
实现速度最快,移动最少。
★找到一个子字符串。优化速度。优化空间。
★比较两个字符串,用O(n)时间和恒量空间。
★假设你有一个用1001个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1到1000(包括1000)之间。此外,除一个数字出现两次外,其他所有数字只出现一次。假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。如果你在运算中使用了辅助的存储方式,那么你能找到不用这种方式的算法吗?
★不用乘法或加法增加8倍。现在用同样的方法增加7倍。
原文:http://my.oschina.net/jimmyhan/blog/526004