今日算法(七)
2018-03-07 17:18
106 查看
第一题:调整整数数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
解析:1.利用冒泡排序的性质,之前是前偶后奇就进行交换
2.利用一个辅助空间,遍历两遍,第一遍进行奇数的插入,第二遍进行偶数的插入,这种解法我就不写了。。。。
public class Solution { public void reOrderArray(int [] array) { if(array == null || array.length == 0){ return; } for(int i = 0; i < array.length; i++){ for(int j = 0; j < array.length - i -1; j++){ if(array[j]%2 == 0 && array[j+1]%2 == 1){ swap(array,j,j+1); } } } } private static void swap(int[] arr, int i, int j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } }
第二题:删除链表中倒数第K个节点
题目描述输入一个链表,输出该链表中倒数第k个结点。
解析:关键点在怎么找到倒数第k个节点,使用两个指针,都指向起始点。然后一个先跑k个节点,另一个不动,然后两个一起跑,第一个节点跑到终点后,第二个节点的位置就是倒数第K个节点
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode FindKthToTail(ListNode head,int k) { if(head == null){ return null; } int count = 0; ListNode cur = head; while(cur != null){ cur = cur.next; count++; } if(k > count){//k的值不能比链表长度长 return null; } ListNode pre = head; while(pre != null){ if(k != 0){ k--; }else{ head = head.next; } pre = pre.next; } return head; } }
第三题:反转链表
题目描述
输入一个链表,反转链表后,输出链表的所有元素。解析:基本操作,都坐下~~
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode ReverseList(ListNode head) { if(head==null){ return null; } ListNode pre = null; ListNode next = null; while(head != null){ next = head.next; head.next = pre; pre = head; head = next; } return pre; } }
第四题:合并两个排序的链表
题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解析:就是外排啦~~,外排:两个指针从头开始,谁小谁移动或者谁大谁移动。 本题的意思是:谁大谁移动。当有一个为null时,那么就直接连接另一个。
/* 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 cur = null; ListNode head = null; while(list1 != null && list2 != null){ if(list1.val <= list2.val){ if(head == null){ head = cur = list1; }else{ cur.next = list1; cur = cur.next; } list1 = list1.next; }else{ if(head == null){ head = cur = list2; }else{ cur.next = list2; cur = cur.next; } list2 = list2.next; } } if(list1 == null){ cur.next = list2; } if(list2 == null){ cur.next = list1; } return head; } }
第五题:树的子结构
题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解析:递归解法先判断头结点是不是相等,不相等则判断左右节点与root2节点是否相等,递归case:root2==null
/** 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 falg = false; //当Tree 9e54 1和Tree2都不为null的时候,才进行比较。否则直接返回false if (root1 != null && root2 != null){ if (root1.val == root2.val){ falg = DoesTree1HaveTree2(root1,root2); } //根节点不匹配,则继续匹配左子节点 if (!falg){ falg = DoesTree1HaveTree2(root1.left,root2); } //根节点不匹配,则继续匹配右子节点 if (!falg){ falg = DoesTree1HaveTree2(root1.right,root2); } } return falg; } public boolean DoesTree1HaveTree2(TreeNode root1,TreeNode root2){ //说明root2遍历完了,返回true if (root2 == null){ return true; } //root遍历完了,root2还没,说明root2不是root1的子树 if (root1 == null){ return false; } //值不匹配返回false if (root1.val != root2.val){ return false; } //匹配则继续递归左子节点和右子节点 return DoesTree1HaveTree2(root1.left,root2.left) && DoesTree1HaveTree2(root1.right,root2.right); } }
相关文章推荐
- 3分钟了解今日头条推荐算法原理(附视频+PPT)
- 今日头条研发算法岗实习生笔试题解答篇_0324晚
- 今日算法(二)
- 今日头条算法原理(全)
- 今日头条2018春季 算法实习生编程题 python
- 今日头条核心技术“个性推荐算法”揭秘
- 今日算法(十)
- 今日头条2018校招算法方向(第一批)编程题1(离散+树状数组)
- 干货丨3分钟了解今日头条推荐算法原理(附视频+PPT)
- 今日头条算法题-求句子中相同单词的个数
- 今日头条研发算法岗实习生笔试题题目篇_0324晚
- PHP版今日头条算法面试题(持续更新)
- 今日头条推荐算法详解(PDF下载)
- 3分钟了解今日头条推荐算法原理(附视频+PPT)
- 今日算法(四)
- 今日算法(十一)
- 今日头条算法
- 今日头条面试算法题
- 今日算法(三)