Skip to content

Commit a328ac7

Browse files
author
piggy1991
committed
peak
1 parent 6123720 commit a328ac7

File tree

3 files changed

+175
-5
lines changed

3 files changed

+175
-5
lines changed

binarySearch/Divide.java

Lines changed: 71 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,90 @@
11
package Algorithms.binarySearch;
22

33
public class Divide {
4-
public int divide(int dividend, int divisor) {
4+
public static void main(String[] strs) {
5+
System.out.println(divide(-2147483648, -1));
6+
}
7+
8+
public int divide1(int dividend, int divisor) {
59
long a = Math.abs((long)dividend);
610

711
// ref : http://blog.csdn.net/kenden23/article/details/16986763
8-
// Note: 在这里必须先取long再abs,否则int的最小值abs后也是原值
12+
// Note: 在这里必须先取long再abs,否则int的最小值abs后也是原值
913
long b = Math.abs((long)divisor);
1014

1115
int ret = 0;
12-
// 这里必须是= 因为相等时也可以减
16+
// 这里必须是= 因为相等时也可以减
1317
while (a >= b) {
14-
// 判断条件是 >=
18+
// 判断条件是 >=
1519
for (long deduce = b, cnt = 1; a >= deduce; deduce <<= 1, cnt <<= 1) {
1620
a -= deduce;
1721
ret += cnt;
1822
}
1923
}
2024

21-
// 获取符号位。根据除数跟被除数的关系来定
25+
// 获取符号位。根据除数跟被除数的关系来定
2226
return (dividend > 0) ^ (divisor > 0) ? -ret: ret;
2327
}
28+
29+
public static int divide(int dividend, int divisor) {
30+
if (divisor == 0) {
31+
return Integer.MAX_VALUE;
32+
}
33+
34+
// Note: 在这里必须先取long再abs,否则int的最小值abs后也是原值
35+
long dividendTmp = Math.abs((long)dividend);
36+
long divisorTmp = Math.abs((long)divisor);
37+
38+
// bug 3: ret should use Long to avoid overflow.
39+
long ret = 0;
40+
// bug 2: should use dividentTmp > divisor as the while judge.
41+
while (dividendTmp >= divisorTmp) {
42+
// bug 1: should use Long for tmp.
43+
long tmp = divisorTmp;
44+
int rst = 1;
45+
while(tmp <= dividendTmp) {
46+
// bug 3: the two statement should inside the while LOOP.
47+
ret += rst;
48+
dividendTmp -= tmp;
49+
50+
tmp <<= 1;
51+
rst <<= 1;
52+
}
53+
}
54+
// bug 4: out of range:
55+
/*
56+
Input: -2147483648, -1
57+
Output: -2147483648
58+
Expected: 2147483647
59+
*/
60+
//ret = ((dividend > 0) ^ (divisor > 0)) ? -ret: ret;
61+
ret = ((((dividend ^ divisor) >> 31) & 1) == 1) ? -ret: ret;
62+
63+
if (ret > Integer.MAX_VALUE || ret < Integer.MIN_VALUE) {
64+
return Integer.MAX_VALUE;
65+
} else {
66+
return (int)ret;
67+
}
68+
}
69+
70+
public int divide3(int dividend, int divisor) {
71+
long a = Math.abs((long)dividend);
72+
long b = Math.abs((long)divisor);
73+
74+
long ret = 0;
75+
76+
while (a >= b) {
77+
for (long tmp = b, cnt = 1; a >= tmp; tmp <<= 1, cnt <<= 1) {
78+
ret += cnt;
79+
a -= tmp;
80+
}
81+
}
82+
83+
ret = (((dividend ^ divisor) >> 31) & 1) == 1 ? -ret: ret;
84+
if (ret > Integer.MAX_VALUE || ret < Integer.MIN_VALUE) {
85+
return Integer.MAX_VALUE;
86+
}
87+
88+
return (int)ret;
89+
}
2490
}

binarySearch/FindPeakElement.java

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package Algorithms.binarySearch;
2+
3+
public class FindPeakElement {
4+
public int findPeakElement1(int[] num) {
5+
if (num == null) {
6+
return 0;
7+
}
8+
9+
if (num.length == 1) {
10+
return 0;
11+
}
12+
13+
for (int i = 0; i < num.length; i++) {
14+
if (i == 0) {
15+
if (num[i] > num[i + 1]) {
16+
return i;
17+
}
18+
continue;
19+
}
20+
21+
if (i == num.length - 1) {
22+
if (num[i] > num[i - 1]) {
23+
return i;
24+
}
25+
continue;
26+
}
27+
28+
if (num[i] > num[i + 1] && num[i] > num[i - 1]) {
29+
return i;
30+
}
31+
}
32+
33+
return -1;
34+
}
35+
36+
public int findPeakElement(int[] num) {
37+
if (num == null) {
38+
return 0;
39+
}
40+
41+
if (num.length == 1) {
42+
return 0;
43+
}
44+
45+
int l = 0;
46+
int r = num.length - 1;
47+
48+
while (l < r - 1) {
49+
int mid = l + (r - l) / 2;
50+
if (num[mid] > num[mid + 1] && num[mid] > num[mid - 1]) {
51+
return mid;
52+
}
53+
54+
if (num[mid] > num[mid - 1] && num[mid] < num[mid + 1]) {
55+
// rising area. move right;
56+
l = mid;
57+
} else if (num[mid] < num[mid - 1] && num[mid] > num[mid + 1]) {
58+
r = mid;
59+
} else {
60+
l = mid;
61+
}
62+
}
63+
64+
return num[l] > num[r] ? l: r;
65+
}
66+
}

hash/Anagrams.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,42 @@ public List<String> anagrams(String[] strs) {
4949

5050
return ret;
5151
}
52+
53+
public static void main(String[] strs1) {
54+
String[] strs = {"str1", "str2", "s1tr"};
55+
System.out.println(anagrams2(strs));
56+
}
57+
58+
public static List<String> anagrams2(String[] strs) {
59+
List<String> ret = new ArrayList<String>();
60+
if (strs == null) {
61+
return ret;
62+
}
63+
64+
HashMap<String, List<String>> map = new HashMap<String, List<String>>();
65+
for (int i = 0; i < strs.length; i++) {
66+
String s = strs[i];
67+
char[] chars = s.toCharArray();
68+
69+
Arrays.sort(chars);
70+
String sSort = new String(chars);
71+
72+
if (map.containsKey(sSort)) {
73+
map.get(sSort).add(s);
74+
} else {
75+
List<String> list = new ArrayList<String>();
76+
list.add(s);
77+
map.put(sSort, list);
78+
}
79+
}
80+
81+
for (Map.Entry<String, List<String>> entry: map.entrySet()) {
82+
List<String> list = entry.getValue();
83+
if (list.size() > 1) {
84+
ret.addAll(list);
85+
}
86+
}
87+
88+
return ret;
89+
}
5290
}

0 commit comments

Comments
 (0)