劍指Offer(11-20)
關於劍指Offer的一些解題思路
題11:數值的整數次方
實現函數double Power(double base, int exponent),求base的exponent次方。 不得使用庫函數,同時不需要考慮大數問題。
import java.util.Scanner; public class Main { public static void main(String[] args)throws Exception { Scanner sc=new Scanner(System.in); double n=sc.nextDouble(); int exp=sc.nextInt(); System.out.println(power(n,exp)); } public static double power(double base ,int exponent)throws Exception{ if(equal(base,0.0) && exponent<0){ throw new Exception("0的負次數冪無意義"); // 1/0 沒意義 } if(exponent<0){ return 1.0/powerWithExponent(base,-exponent); }else { return powerWithExponent(base,exponent); } } public static double powerWithExponent(double base , int exponent){ if(base==0) return 1; if(exponent==1) return base; double res =1; for(int i=0;i<exponent;i++){ res=res*base; } return res; } public static boolean equal(double base , double none){ if((base-none>-0.0000001)&&base-none<0.0000001){ //在0附近,誤差0.0000001 return true; }else { return false; } } }
# 題12:打印1到最大的n位數 輸入數字n,按順序打印出從1最大的n位十進制數。比如輸入3,則打印出1、2、3 一直到最大的3位數即999。 ```
<br/>
# 題13:
<br/>
# 題14:調整數組順序使奇數位於偶數前面
輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有奇數位於數組的前半部分,所有偶數位予數組的後半部分。
public class Main { public static void main(String[] args)throws Exception { int[] array = {1, 4, 2, 5, 21, 67, 21, 66, 23, 77, 68};
for (int i = 0; i < array.length; i++) { System.out.println(order(array)[i]); } } public static int [] order(int [] array){ if(array.length==0||array==null) return array; int start=0; int end=array.length-1; while (start<end){ while (start<end && !isEven(array[start])){ start++; } while (start<end&& isEven(array[end])){ end--; } if(start<end){ int temp=array[start]; array[start]=array[end]; array[end]=temp; } }
return array; }
public static boolean isEven(int n){
return n%2==0;
}
}
<br/>
# 題15:鏈表中倒數第k個結點
題目:輸入一個鏈表,輸出該鏈表中倒數第k 個結點.為了符合大多數人的習慣,本題從 1 開始計數,即鏈表的尾結點是倒數第 1 個結點.例如一個鏈表有 6 個結點,從頭結點開始它們的值依次是 1 、2、3、4、5 、6。這個個鏈表的倒數第 3 個結點是值為 4 的結點。
public class Main { public static void main(String[] args){ ListNode head=new ListNode(); ListNode second=new ListNode(); ListNode third= new ListNode(); ListNode forth=new ListNode(); head.next=second; second.next=third; third.next=forth; head.val=1; second.val=2; third.val=3; forth.val=4; System.out.println(findKToTail(head,3).val); }
public static ListNode findKToTail(ListNode head , int k){
if (head==null&&k==0){
return null;
}
int count=0;
ListNode resNode = new ListNode();
ListNode headNode=head;
while (headNode!=null){
headNode=headNode.next;
count++;
}
for(int i=0;i<=count-k;i++){
head=head.next;
}
return head.next;
}
public static class ListNode{
int val;
ListNode next;
}
}
<br/>
# 題16:反轉鏈表
<br/>
# 題17:合並兩個排序的鏈表
題目:輸入兩個遞增排序的鏈表,合並這兩個鏈表並使新鏈表中的結點仍然是按照遞增排序的
`遞歸的方法真是好用`
public class Main { public static void main(String[] args){ ListNode head1=new ListNode(); ListNode second1=new ListNode(); ListNode third1= new ListNode(); ListNode forth1=new ListNode(); head1.next=second1; second1.next=third1; third1.next=forth1; head1.val=1; second1.val=5; third1.val=8; forth1.val=13; ListNode head2=new ListNode(); ListNode second2=new ListNode(); ListNode third2= new ListNode(); ListNode forth2=new ListNode(); head2.next=second2; second2.next=third2; third2.next=forth2; head2.val=2; second2.val=4; third2.val=7; forth2.val=9; ListNode resNode=mergeList(head1,head2); while (resNode!=null) { System.out.println(resNode.val); resNode = resNode.next; } }
public static ListNode mergeList(ListNode head1 , ListNode head2){
if(head1==null){
return head2;
}
if(head2==null){
return head1;
}
ListNode mergeNode=null;
if(head1.val<head2.val){
mergeNode=head1;
mergeNode.next=mergeList(head1.next,head2);
}else {
mergeNode=head2;
mergeNode.next=mergeList(head1,head2.next);
}
return mergeNode;
}
public static class ListNode{
int val;
ListNode next;
}
}
<br/>
# 題18:樹的子結構
<br/>
# 題19:二叉樹的鏡像
題目描述
操作給定的二叉樹,將其變換為源二叉樹的鏡像。
輸入描述:
二叉樹的鏡像定義:源二叉樹
8
/ 6 10
/ \ / 5 7 9 11
鏡像二叉樹
8
/ 10 6
/ \ / 11 9 7 5
public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public void Mirror(TreeNode root) {
if(root==null ) return ;
TreeNode temp;
temp=root.left;
root.left=root.right;
root.right=temp;
Mirror(root.left);
Mirror(root.right);
}
}
<br/>
# 題20:順時針打印矩陣
輸入一個矩陣,按照從外向裏以順時針的順序依次打印出每一個數字,例如,如果輸入如下矩陣:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
則依次打印出數字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
import java.util.ArrayList;
public class Solution {
public ArrayList
public static void printMatrixInCircle(int [][]matix,ArrayList<Integer>result,int start){
int endX = matix[0].length - start -1;
int endY = matix.length - start -1;
//從左向右打印一行
for(int i = start;i <=endX;i++){
result.add(matix[start][i]);
}
//從上到下
for(int i = start+1; i <=endY;i++)
result.add(matix[i][endX]);
//從右到左
if(start < endX &&start < endY)
for(int i = endX -1;i>= start;i--)
result.add(matix[endY][i]);
//從下到上
if(start < endX && start < endY-1)
for(int i = endY - 1;i >=start+1;i--)
result.add(matix[i][start]);
}
}
![](http://img.hb.aicdn.com/402338e39ee91c9f2f55116942593e37d009fd15418553-ulMGQY_fw658)
劍指Offer(11-20)