剑指Offer学习笔记(2)
2016-03-21 16:26
204 查看
一、代码的完整性
1. 数值的整数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
2. 调整数组顺序使奇数位于偶数前面
3. 反转链表
输入一个链表,反转链表后,输出链表的所有元素。
4. 链表中倒数第k个结点
代码思路如下:两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点。然后两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了。
5. 打印1到最大的n位数
二、代码的完整性
1. 链表中倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点。
相关题目:找中间结点可以两个指针,一个一次走一个 一个一次走两个,快的首先到结尾。
判断是否是环形链表,快的追上慢的。
2.
反转链表
输入一个链表,反转链表后,输出链表的所有元素。
3.
反转链表
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
4.
树的子结构
输入两颗二叉树A,B,判断B是不是A的子结构。
1. 数值的整数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class Solution { public double Power( double base, int exponent) { if (exponent== 0 ){ return 1 ; } else if (exponent> 0 ){ double result= 1 ; for ( int i= 1 ;i<=exponent;i++){ result*=base; } return result; } else { double result= 1.0 ; exponent=-exponent; for ( int i= 1 ;i<=exponent;i++){ result*=( double )base; } return (( double ) 1.0 )/(( double )result); } //return exponent; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public class Solution { public void reOrderArray( int [] array) { int indexEven = - 1 ; for ( int i = 0 ; if (array[i] % 2 == 1 ) { if (indexEven 1 ) { int temp = array[i]; for ( int j array[j] = array[j- 1 ]; } array[indexEven] = temp; indexEven += 1 ; } } else { if (indexEven 1 ) { indexEven = i; } } } } } |
输入一个链表,反转链表后,输出链表的所有元素。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode ReverseList(ListNode head) { ListNode cur=head; ListNode next= null ; ListNode pre= null ; if (head== null ||head.next== null ){ return head; } while (cur!= null ){ next=cur.next; cur.next=pre; pre=cur; cur=next; } return pre; } } |
代码思路如下:两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点。然后两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode FindKthToTail(ListNode head, int k) { ListNode first = head; ListNode second = head; if (head null ||k<= 0 ) { return null ; } for ( int i = 1 ; if (second.next != null ) { second = second.next; } else { return null ; } } while (second.next!= null ){ second=second.next; first=first.next; } return first; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | public class Solution { /** * 递归调用的思路 * @param n */ public static void Print1ToMaxOfNDigits( int n) { if (n<= 0 ){ return ; } char [] num = new char ; //num ='\0'; for ( int i= 0 ;i< 10 ;i++){ num[ 0 ]=( char )(i+ '0' ); //字符转化成数字 Print1ToMaxOfNDigitsRecursive(num,n, 0 ); } } private static void Print1ToMaxOfNDigitsRecursive( char [] num, int length, int index) { if (index==length- 1 ){ //如果组合完毕 //System.out.print(num); printNum(num); return ; } for ( int i= 0 ;i< 10 ;i++){ num[index+ 1 ]=( char ) (( char ) i+ '0' ); Print1ToMaxOfNDigitsRecursive(num, 1 ); } } private static void printNum( char [] num) { boolean isBegin0 = true ; int len=num.length; for ( int i= 0 ;i<len;i++){ if (isBegin0&&num[i]!= '0' ){ isBegin0= false ; } if (!isBegin0){ System.out.print(num[i]); } } System.out.print( ' ' ); } |
1. 链表中倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode FindKthToTail(ListNode head, int k) { ListNode first = head; ListNode second = head; if (head null ||k<= 0 ) { return null ; } for ( int i = 1 ; if (second.next != null ) { second = second.next; } else { return null ; } } while (second.next!= null ){ second=second.next; first=first.next; } return first; } } |
判断是否是环形链表,快的追上慢的。
2.
反转链表
输入一个链表,反转链表后,输出链表的所有元素。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode ReverseList(ListNode head) { ListNode temp= null ; ListNode orgin= null ; if (head== null ){ return head; } temp=orgin=head; head=head.next; orgin.next= null ; while (head!= null ){ temp=head; head=head.next; temp.next=orgin; orgin=temp; } return temp; } } |
反转链表
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode Merge(ListNode list1,ListNode list2) { if (list1== null ){ return list2; } if (list2== null ){ return list1; } ListNode mergeList = null ; if (list1.val<list2.val){ mergeList=list1; mergeList.next=Merge(list1.next,list2); } else { mergeList=list2; mergeList.next=Merge(list1,list2.next); } return mergeList; } } |
树的子结构
输入两颗二叉树A,B,判断B是不是A的子结构。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { public boolean HasSubtree(TreeNode root1, TreeNode root2) { boolean flag= false ; if (root1!= null &&root2!= null ){ if (root1.val==root2.val){ flag=doesTree1HaveTree2(root1,root2); } if (!flag){ flag=HasSubtree(root1.left,root2); } if (!flag){ flag=HasSubtree(root1.right,root2); } } return flag; } private boolean doesTree1HaveTree2(TreeNode root1, TreeNode root2) { if (root2== null ){ return true ; } if (root1== null ){ return false ; } if (root1.val!=root2.val){ return false ; } if (root1.val==root2.val){ return doesTree1HaveTree2(root1.left, root2.left)&&doesTree1HaveTree2(root1.right, root2.right); } return false ; } } |
相关文章推荐
- 快速掌握Node.js模块封装及使用
- 逗号(分组选择器),空格(后代选择器),>(子选择器),+(紧紧挨着的一个)
- java ScriptEngine 使用 (支持JavaScript脚本,eval()函数等) - *(00)*
- 【JavaScript】a标签onclick传递参数不对
- ExtJs之Panel基本布局
- 使用json格式的数据进行通信
- JS中数字计算精度
- 格式化CSS文件,使之变成键值对形式
- RequireJS结合jQuery validation实现基础表单验证
- 快速掌握Node.js之Window下配置NodeJs环境
- jquery操作checkbox问题及解决方法:全选/取消 一次后再也无法全选
- js数组基础整理
- 正则表达式的JS验证
- 30套css后台模板,easyui,jquery 网站
- React Native学习笔记-1:JSC profiler is not supported.(转载)
- 如何用css 将span 右对齐
- jquery require.js AMD
- JS DOM实现鼠标滑动图片效果
- 原生js ajax 实例
- 用JS写递归中容易出错的点