如果IDE没有代码自动补全功能,所以你应该记住下面的这些方法。
栈:
classStack{Nodetop;publicNodepeek(){if(top!=null){returntop;}returnnull;}publicNodepop(){if(top==null){returnnull;}else{Nodetemp=newNode(top.val);top=top.next;returntemp;}}publicvoidpush(Noden){if(n!=null){n.next=top;top=n;}}}队列:
下面是一个简单的图广度优先搜索的实现。
1)定义GraphNode
classGraphNode{intval;GraphNodenext;GraphNode[]neighbors;booleanvisited;GraphNode(intx){val=x;}GraphNode(intx,GraphNode[]n){val=x;neighbors=n;}publicStringtoString(){return"value:"+this.val;}}2)定义一个队列Queue
classQueue{GraphNodefirst,last;publicvoidenqueue(GraphNoden){if(first==null){first=n;last=first;}else{last.next=n;last=n;}}publicGraphNodedequeue(){if(first==null){returnnull;}else{GraphNodetemp=newGraphNode(first.val,first.neighbors);first=first.next;returntemp;}}}3)用队列Queue实现广度优先搜索
publicclassGraphTest{publicstaticvoidmain(String[]args){GraphNoden1=newGraphNode(1);GraphNoden2=newGraphNode(2);GraphNoden3=newGraphNode(3);GraphNoden4=newGraphNode(4);GraphNoden5=newGraphNode(5);n1.neighbors=newGraphNode[]{n2,n3,n5};n2.neighbors=newGraphNode[]{n1,n4};n3.neighbors=newGraphNode[]{n1,n4,n5};n4.neighbors=newGraphNode[]{n2,n3,n5};n5.neighbors=newGraphNode[]{n1,n3,n4};breathFirstSearch(n1,5);}publicstaticvoidbreathFirstSearch(GraphNoderoot,intx){if(root.val==x)System.out.println("findinroot");Queuequeue=newQueue();root.visited=true;queue.enqueue(root);while(queue.first!=null){GraphNodec=(GraphNode)queue.dequeue();for(GraphNoden:c.neighbors){if(!n.visited){System.out.print(n+"");n.visited=true;if(n.val==x)System.out.println("Find"+n);queue.enqueue(n);}}}}}Output:
value:2value:3value:5Findvalue:5value:45.排序
对程序员来说,递归应该是一个与生俱来的思想(abuilt-inthought),可以通过一个简单的例子来说明。
问题:有n步台阶,一次只能上1步或2步,共有多少种走法。
步骤1:找到走完前n步台阶和前n-1步台阶之间的关系。
为了走完n步台阶,只有两种方法:从n-1步台阶爬1步走到或从n-2步台阶处爬2步走到。如果f(n)是爬到第n步台阶的方法数,那么f(n)=f(n-1)+f(n-2)。
步骤2:确保开始条件是正确的。
f(0)=0;
f(1)=1;
f(5)
f(4)+f(3)
f(3)+f(2)+f(2)+f(1)
f(2)+f(1)+f(1)+f(0)+f(1)+f(0)+f(1)
f(1)+f(0)+f(1)+f(1)+f(0)+f(1)+f(0)+f(1)
直接的想法是将递归转换为迭代:
动态规划是解决下面这些性质类问题的技术:
爬台阶问题完全符合上面的四条性质,因此可以用动态规划法来解决。
位操作符:
获得给定数字n的第i位:(i从0计数并从右边开始)
publicstaticbooleangetBit(intnum,inti){intresult=num&(1<
i=1,n=10
1<<1=10
1010&10=10
10isnot0,soreturntrue;
一个房间里有50个人,那么至少有两个人生日相同的概率是多少?(忽略闰年的事实,也就是一年365天)
计算某些事情的概率很多时候都可以转换成先计算其相对面。在这个例子里,我们可以计算所有人生日都互不相同的概率,也就是:365/365*364/365*363/365*…*(365-49)/365,这样至少两个人生日相同的概率就是1–这个值。
publicstaticdoublecaculateProbability(intn){doublex=1;for(inti=0;i