左旋转字符串
字符序列S=”abcXYZdef”
要求输出循环左移3位后的结果
即“XYZdefabc”
1 | public static String LeftRotateString(String str, int n) { |
知来者之可追
字符序列S=”abcXYZdef”
要求输出循环左移3位后的结果
即“XYZdefabc”
1 | public static String LeftRotateString(String str, int n) { |
求 二叉搜索树的第k个结点
给定一颗二叉搜索树,请找出其中的第k大的结点。
例如:
5 / \ 3 7 / \ / \ 2 4 6 8
中,按结点数值大小顺序第三个结点的值为4。
1 | public static TreeNode KthNode(TreeNode pRoot, int k) { |
数组中未出现的最小正整数
arr=[-1,2,3,4] 返回 1
arr=[1,2,3,4] 返回 5
1 | public static int missNum(int[] arr) { |
原题 :(数组中超过一半(N/2)的数)
进阶 : 找到出现次数超过N/K的数
tips : 原题一个候选数 一次删2个 进阶题 一次k-1个候选数 一次删k个
1 | public static void pirntKMajor(int[] arr, int k) { |
给定一个无序数组,找到其中最小的K个数
利用最大堆,只要维护堆内有k个数即可
1 | //利用最大堆 |
快排思想, 无需全部排序,保证前k个数有序即可
1 | public static int partition(int[] arr,int start,int end){ |
在未排序数组中 找到和为k的最长子数组长度
1 | public static int maxLength(int[] arr, int k) { |
反转链表
1 | // 非递归 |
求数组排序后相邻数的最大差值
1 | public static int maxGap(int[] arr){ |
1 | public class hanoi { |
给定一个长度为N(N>1)的整型数组arr,可以划分成左右两个部分,
左部分arr[0..K],右部分arr[K+1..N-1],K可以取值的范围是[0,N-2]。
求这么多划分方案中,左部分中的最大值减去右部分最大值的绝对值,
最大是多少?例如[2,7,3,1,1],当左部分为[2,7],右部分为[3,1,1]时,
左部分中的最大值减去右部分最大值的绝对值为4。当左部分为[2,7,3],
右部分为[1,1]时,左部分中的最大值减去右部分最大值的绝对值为6。
还有很多划分方案,但最终返回6。
1 | public static int maxABS(int[] arr){ |
最优解,时间复杂度O(N),额外空间复杂度O(1)。先求整个arr的最大值max,
因为max是全局最大值,所以不管怎么划分,max要么会成为左部分的最大值,
要么会成为右部分的最大值。如果max作为左部分的最大值,
接下来我们只要让右部分的最大值尽量小就可以了。
右部分的最大值怎么尽量小呢?
右部分只含有arr[N-1]的时候就是尽量小的时候。同理,
如果max作为右部分的最大值,只要让左部分的最大值尽量小就可以了,
左部分只含有arr[0]的时候就是尽量小的时候。
所以整个求解过程会变得异常简单