面试题41:数据流中的中位数
public class Demo {
public static void main(String[] args) {
Demo demo = new Demo();
System.out.println(demo.getMedian());
demo.insert(1);
demo.insert(2);
System.out.println(demo.getMedian());
demo.insert(3);
System.out.println(demo.getMedian());
}
private int count = 0;
private PriorityQueue<Integer> minHeap = new PriorityQueue<>();
private PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(15,
new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
public void insert(Integer num) {
if ((count & 1) == 0) {
maxHeap.offer(num);
int filteredMaxNum = maxHeap.poll();
minHeap.offer(filteredMaxNum);
} else {
minHeap.offer(num);
int filteredMinNum = minHeap.poll();
maxHeap.offer(filteredMinNum);
}
count++;
}
public Double getMedian() {
if (count == 0){
return 0.0;
}
if ((count & 1) == 0) {
return new Double((minHeap.peek() + maxHeap.peek())) / 2;
} else {
return new Double(minHeap.peek());
}
}
}
面试题42:连续子数组的最大和
public class Demo {
public static void main(String[] args) {
Demo demo = new Demo();
int[] arr = { 1, -2, 3, 10, -4, 7, 2, -5 };
int maxSum = demo.findGreatestSumOfSubArray(arr);
System.out.println(maxSum);
}
boolean invalid = false;
public int findGreatestSumOfSubArray(int[] arr) {
if (arr == null || arr.length <= 0) {
invalid = true;
return 0;
}
int maxSum = Integer.MIN_VALUE;
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
if (sum < 0) sum = 0;
if (maxSum < sum)
maxSum = sum;
}
return maxSum;
}
}
面试题43:1~n整数中1出现的次数
从1到n整数中1出现的次数(Java)
面试题44:数字序列中某一位的数字
public class Demo {
public static void main(String[] args) {
Demo demo = new Demo();
int digit = demo.digitAtIndex(10);
System.out.println(digit);
}
public int digitAtIndex(int index) {
if (index < 0) return -1;
if (index < 10) return index;
int curIndex = 10, length = 2;
int boundNum = 10;
while (curIndex + lengthSum(length) < index) {
curIndex += lengthSum(length);
boundNum *= 10;
length++;
}
int addNum = (index - curIndex) / length;
int curNum = boundNum + addNum;
return Integer.toString(curNum).charAt(
index - curIndex - addNum * length) - '0';
}
public static int lengthSum(int length) {
int count = 9;
for (int i = 1; i < length; i++)
count *= 10;
return count * length;
}
}