Skip to content

Commit 97c58b1

Browse files
committed
20170113
1 parent c949168 commit 97c58b1

File tree

85 files changed

+2657
-13
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

85 files changed

+2657
-13
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package offer.array;
2+
3+
import java.util.ArrayList;
4+
5+
/**
6+
* 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。
7+
* 但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,
8+
* 他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?
9+
* Good Luck!
10+
输出描述:
11+
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
12+
*/
13+
public class FindContinunousSequence {
14+
public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) {
15+
ArrayList<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>> ();
16+
if(sum<=0){
17+
return res;
18+
}
19+
int small=1;
20+
int big=2;
21+
int currSum=small+big;
22+
int middle=(1+sum)/2;
23+
while(small<middle){
24+
if(currSum==sum){
25+
ArrayList<Integer> list=new ArrayList<>();
26+
for(int i=small;i<=big;i++){
27+
list.add(i);
28+
}
29+
res.add(list);
30+
}
31+
while(currSum>sum&&small<middle){
32+
currSum=currSum-small;
33+
small++;
34+
if(currSum==sum){
35+
ArrayList<Integer> list=new ArrayList<>();
36+
for(int i=small;i<=big;i++){
37+
list.add(i);
38+
}
39+
res.add(list);
40+
}
41+
}
42+
big++;
43+
currSum+=big;
44+
}
45+
return res;
46+
}
47+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package offer.array;
2+
3+
/**
4+
*
5+
* 连续子数组的最大和
6+
* HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,
7+
* 常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,
8+
* 并期望旁边的正数会弥补它呢?
9+
* 例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至少是1)
10+
*/
11+
public class FindGreatestSumOfSubArray {
12+
public int FindGreatestSumOfSubArray(int[] array) {
13+
if(array==null||array.length==0){
14+
return 0;
15+
}
16+
int currentSum=0;
17+
int currentMax=Integer.MIN_VALUE;
18+
for(int i=0;i<array.length;i++){
19+
if(currentSum<0){
20+
currentSum=array[i];
21+
}else{
22+
currentSum+=array[i];
23+
}
24+
if(currentSum>currentMax){
25+
currentMax=currentSum;
26+
}
27+
}
28+
return currentMax;
29+
}
30+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package offer.array;
2+
3+
/**
4+
* 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
5+
* 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
6+
* 解答:
7+
*
8+
* 思路一:
9+
* 利用二维数组由上到下,由左到右递增的规律,
10+
* 那么选取右上角或者左下角的元素a[row][col]与target进行比较,
11+
* 当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,
12+
* 即col--;
13+
*
14+
* 思路二:
15+
* 把每一行看成有序递增的数组,
16+
* 利用二分查找,
17+
* 通过遍历每一行得到答案,
18+
* 时间复杂度是nlogn
19+
*/
20+
public class FindInMatrix {
21+
22+
public boolean Find1(int[][] array, int target) {
23+
if (array == null) {
24+
return false;
25+
}
26+
int len = array.length - 1;
27+
int i = 0;
28+
while ((i < array[0].length) && (len >= 0)) {
29+
if (array[len][i] < target) {
30+
i++;
31+
} else if (array[len][i] > target) {
32+
len--;
33+
} else {
34+
return true;
35+
}
36+
}
37+
return false;
38+
39+
}
40+
public boolean Find2(int[][] array,int target){
41+
for(int i=0;i<array.length;i++){
42+
int low=0;
43+
int high=array[i].length-1;
44+
while(low<=high){
45+
int mid=(low+high)/2;
46+
if(target>array[i][mid]){
47+
low=mid+1;
48+
}else if(target<array[i][mid]){
49+
high=mid-1;
50+
}else{
51+
return true;
52+
}
53+
}
54+
}
55+
return false;
56+
}
57+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package offer.array;
2+
3+
import java.util.ArrayList;
4+
5+
/**
6+
* 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,
7+
* 如果有多对数字的和等于S,输出两个数的乘积最小的。
8+
输出描述:
9+
对应每个测试案例,输出两个数,小的先输出。
10+
*/
11+
public class FindNumbersWithSum {
12+
public ArrayList<Integer> FindNumbersWithSum(int [] array, int sum) {
13+
ArrayList<Integer> res=new ArrayList<>();
14+
if(array==null){
15+
return res;
16+
}
17+
int i=0;
18+
int j=array.length-1;
19+
int currSum=0;
20+
while(i<j){
21+
currSum=array[i]+array[j];
22+
if(currSum==sum){
23+
res.add(array[i]);
24+
res.add(array[j]);
25+
}
26+
if(currSum<sum){
27+
i++;
28+
}else {
29+
j--;
30+
}
31+
if(res.size()==2){
32+
return res;
33+
}
34+
}
35+
return res;
36+
}
37+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package offer.array;
2+
3+
/**
4+
* 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
5+
*/
6+
public class FindNumsAppearOnce {
7+
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
8+
if(array==null){
9+
return;
10+
}
11+
int xor=0;
12+
for(int i=0;i<array.length;i++){
13+
xor^=array[i];
14+
}
15+
//找到为1的位
16+
int flag=1;
17+
while((xor&flag)==0)
18+
flag=flag<<1;
19+
for(int i=0;i<array.length;i++){
20+
if((array[i]&flag)!=0){
21+
num1[0]^=array[i];
22+
}else{
23+
num2[0]^=array[i];
24+
}
25+
}
26+
}
27+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package offer.array;
2+
3+
import java.util.ArrayList;
4+
5+
/**
6+
* 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
7+
*/
8+
public class GetLeastNumbers {
9+
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
10+
11+
if(input==null||k<1||k>input.length){
12+
return new ArrayList<Integer>();
13+
}
14+
create_heap(input,k);
15+
for(int i=k;i<input.length;i++){
16+
if(input[i]<input[0]){
17+
input[0]=input[i];
18+
percolate_down(input,0,k);
19+
}
20+
}
21+
ArrayList<Integer> list=new ArrayList<>();
22+
for(int i=0;i<k;i++){
23+
list.add(input[i]);
24+
}
25+
return list;
26+
}
27+
public void create_heap(int[] arr,int heapSize){
28+
for(int i=heapSize/2-1;i>=0;i--){
29+
percolate_down(arr,i,heapSize);
30+
}
31+
}
32+
public void percolate_down(int[] arr,int r,int heapSize){
33+
int s=2*r+1;
34+
while(s<heapSize){
35+
if(s<(heapSize-1)&&arr[s]<arr[s+1]){
36+
s++;
37+
}
38+
if(arr[s]>arr[r]){
39+
int temp=arr[s];
40+
arr[s]=arr[r];
41+
arr[r]=temp;
42+
r=s;
43+
s=2*r+1;
44+
}else{
45+
break;
46+
}
47+
48+
}
49+
}
50+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package offer.array;
2+
3+
/**
4+
*
5+
* 统计一个数字在排序数组中出现的次数。
6+
*/
7+
public class GetNumberOfK {
8+
public static int GetNumberOfK(int[] array, int k) {
9+
if (array == null || array.length == 0) {
10+
return 0;
11+
}
12+
int start = getFirstK(array, k, 0, array.length - 1);
13+
int end = getLastK(array, k, 0, array.length - 1);
14+
if (end>-1&&start>-1) {
15+
return end - start + 1;
16+
}else{
17+
return 0;
18+
}
19+
}
20+
21+
public static int getFirstK(int[] arr, int k, int low, int high) {
22+
if (low > high) {
23+
return -1;
24+
}
25+
int mid = (low + high) >> 1;
26+
if (arr[mid] > k) {
27+
return getFirstK(arr, k, low, mid - 1);
28+
} else if (arr[mid] < k) {
29+
return getFirstK(arr, k, mid + 1, high);
30+
} else {
31+
if ((mid > 0 && arr[mid - 1] != k)||mid==0) {
32+
return mid;
33+
} else {
34+
35+
return getFirstK(arr, k, low, mid - 1);
36+
37+
}
38+
}
39+
40+
}
41+
42+
public static int getLastK(int[] arr, int k, int low, int high) {
43+
if (low > high) {
44+
return -1;
45+
}
46+
int mid = (low + high) >> 1;
47+
if (arr[mid] > k) {
48+
return getLastK(arr, k, low, mid - 1);
49+
} else if (arr[mid] < k) {
50+
return getLastK(arr, k, mid + 1, high);
51+
} else {
52+
if ((mid < arr.length-1 && arr[mid + 1] != k)||mid==arr.length-1) {
53+
return mid;
54+
} else {
55+
56+
return getLastK(arr, k, mid + 1, high);
57+
58+
}
59+
}
60+
61+
}
62+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package offer.array;
2+
3+
/**
4+
* 把只包含因子2、3和5的数称作丑数(Ugly Number)。
5+
* 例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
6+
*/
7+
public class GetUglyNumber {
8+
public int GetUglyNumber_Solution(int index) {
9+
if(index<=0){
10+
return 0;
11+
}
12+
int[] res=new int[index];
13+
int i2=0;
14+
int i3=0;
15+
int i5=0;
16+
res[0]=1;
17+
int count=1;
18+
while(count<index){
19+
int tmp=Math.min(Math.min(res[i2]*2,res[i3]*3),res[i5]*5);
20+
if(tmp==res[i2]*2) i2++;
21+
if(tmp==res[i3]*3) i3++;
22+
if(tmp==res[i5]*5) i5++;
23+
res[count++]=tmp;
24+
25+
}
26+
27+
return res[index-1];
28+
}
29+
}

0 commit comments

Comments
 (0)