Skip to content

Commit 55d872e

Browse files
committed
update
1 parent 5c34977 commit 55d872e

File tree

18 files changed

+807
-0
lines changed

18 files changed

+807
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package problem33;
2+
3+
import java.util.ArrayList;
4+
import java.util.LinkedList;
5+
import java.util.List;
6+
7+
/**
8+
* 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
9+
* 例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
10+
* Created by bjyangrubing on 2016/8/22.
11+
*/
12+
public class SortArrayForMinNumber
13+
{
14+
15+
List<String> l = new ArrayList<String>();
16+
17+
public String PrintMinNumber(int[] numbers)
18+
{
19+
String result = "";
20+
if (numbers == null || numbers.length <= 0)
21+
return result;
22+
List<Integer> list = new LinkedList<Integer>();
23+
for (int i = 0; i < numbers.length; i++)
24+
{
25+
list.add(numbers[i]);
26+
}
27+
28+
//对数组进行全排列,得到所有可能的结果,然后进行遍历
29+
permation("", list);
30+
result = l.get(0);
31+
for (int i = 1; i < l.size(); i++)
32+
{
33+
if (l.get(i).compareTo(result) < 0)
34+
result = l.get(i);
35+
}
36+
return result;
37+
}
38+
39+
void permation(String prefix, List<Integer> list)
40+
{
41+
if (list.size() == 0)
42+
{
43+
l.add(prefix);
44+
}
45+
else
46+
{
47+
for (int i = 0; i < list.size(); i++)
48+
{
49+
List<Integer> temp = new LinkedList<Integer>(list.subList(0, i));
50+
temp.addAll(list.subList(i + 1, list.size()));
51+
permation(prefix + list.get(i), temp);
52+
}
53+
}
54+
}
55+
56+
public static void main(String[] args)
57+
{
58+
59+
System.out.println(new SortArrayForMinNumber().PrintMinNumber(new int[]
60+
{ 3, 32, 321 }));
61+
}
62+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package problem34;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
/**把只包含因子2、3和5的数称作丑数(Ugly Number)。
7+
* 例如6、8都是丑数,但14不是,因为它包含因子7。
8+
* 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
9+
* Created by bjyangrubing on 2016/8/23.
10+
*/
11+
public class UglyNumber
12+
{
13+
public int GetUglyNumber_Solution(int index)
14+
{
15+
if (index <= 0)
16+
return 0;
17+
List<Integer> list = new ArrayList<Integer>();
18+
list.add(1);
19+
20+
//分别表示这个乘以2后大于nowmax的最小值
21+
int m2 = 0, m3 = 0, m5 = 0;
22+
while (list.size() < index)
23+
{
24+
int nowMax = list.get(list.size() - 1);//由于是有序数组,当前的最大值nowMax为最后一个
25+
for (int i = 0; i < list.size(); i++)
26+
{
27+
if (list.get(i) * 2 > nowMax)
28+
{
29+
m2 = list.get(i) * 2;
30+
break;
31+
}
32+
33+
}
34+
for (int i = 0; i < list.size(); i++)
35+
{
36+
if (list.get(i) * 3 > nowMax)
37+
{
38+
m3 = list.get(i) * 3;
39+
break;
40+
}
41+
}
42+
for (int i = 0; i < list.size(); i++)
43+
{
44+
if (list.get(i) * 5 > nowMax)
45+
{
46+
m5 = list.get(i) * 5;
47+
break;
48+
}
49+
}
50+
51+
int min = Math.min(m2, Math.min(m3, m5));
52+
list.add(min);
53+
}
54+
55+
return list.get(index - 1);
56+
}
57+
58+
public boolean isUglyNumber(int number)
59+
{
60+
while (number % 2 == 0)
61+
number /= 2;
62+
while (number % 3 == 0)
63+
number /= 3;
64+
while (number % 5 == 0)
65+
number /= 5;
66+
return number == 1 ? true : false;
67+
}
68+
69+
public static void main(String[] args)
70+
{
71+
System.out.println(new UglyNumber().GetUglyNumber_Solution(1500));
72+
}
73+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package problem35;
2+
3+
import java.util.LinkedHashMap;
4+
5+
/**找出字符串中第一个只出现一次的字符
6+
* Created by bjyangrubing on 2016/8/23.
7+
*/
8+
public class FindNotRepeatingChar
9+
{
10+
11+
public int FirstNotRepeatingChar(String str)
12+
{
13+
int result = -1;
14+
if (str == null || str.length() <= 0)
15+
return result;
16+
char[] arr = str.toCharArray();
17+
LinkedHashMap<Character, Integer> map = new LinkedHashMap<Character, Integer>();
18+
for (int i = 0; i < arr.length; i++)
19+
{
20+
21+
if (!map.containsKey(arr[i]))
22+
{
23+
map.put(arr[i], 1);
24+
}
25+
else
26+
{
27+
Integer count = map.get(arr[i]);
28+
map.put(arr[i], count + 1);
29+
}
30+
}
31+
32+
for (int i = 0; i < arr.length; i++)
33+
{
34+
if (map.get(arr[i]) == 1)
35+
return i;
36+
}
37+
return result;
38+
}
39+
40+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package problem36;
2+
3+
/**
4+
* 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P
5+
* Created by bjyangrubing on 2016/8/23.
6+
*/
7+
public class InversePairs
8+
{
9+
public int InversePairs(int[] array)
10+
{
11+
if (array == null || array.length <= 0)
12+
return 0;
13+
14+
//构造一个辅助数组
15+
int[] copy = new int[array.length];
16+
for (int i = 0; i < array.length; i++)
17+
{
18+
copy[i] = array[i];
19+
}
20+
21+
int count = inverseParisCore(array, copy, 0, array.length - 1);
22+
23+
return count;
24+
}
25+
26+
private int inverseParisCore(int[] array, int[] copy, int start, int end)
27+
{
28+
//递归终止条件
29+
if (start == end)
30+
{
31+
copy[start] = array[start];
32+
return 0;
33+
}
34+
35+
int middle = (start + end) / 2;
36+
int leftCount = inverseParisCore(copy, array, start, middle);
37+
int rightCount = inverseParisCore(copy, array, middle + 1, end);
38+
39+
int i = middle;
40+
int j = end;
41+
int indexCopy = end;
42+
int count = 0;
43+
while (i >= start && j >= middle + 1)
44+
{
45+
if (array[i] > array[j])
46+
{
47+
copy[indexCopy--] = array[i--];
48+
count += j - middle;
49+
}
50+
else
51+
{
52+
copy[indexCopy--] = array[j--];
53+
}
54+
}
55+
56+
for (; i >= start; --i)
57+
copy[indexCopy--] = array[i];
58+
59+
for (; j >= middle + 1; --j)
60+
copy[indexCopy--] = array[j];
61+
62+
return (leftCount + rightCount + count);
63+
}
64+
65+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package problem37;
2+
3+
import utils.ListNode;
4+
5+
/**输入两个链表,找出它们的第一个公共结点。
6+
* Created by bjyangrubing on 2016/8/23.
7+
*/
8+
public class FirstCommonNodesInLists
9+
{
10+
/**
11+
* 思路:先找出两个链表的长度差值k,让长的链表先走k步
12+
* 然后让两个链表一起走,一直遇到相同的节点则返回
13+
* @param pHead1
14+
* @param pHead2
15+
* @return
16+
*/
17+
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2)
18+
{
19+
if (pHead1 == null || pHead2 == null)
20+
return null;
21+
int length1 = getListLength(pHead1);
22+
int length2 = getListLength(pHead2);
23+
//两个链表的长度差值
24+
int diff = (length1 - length2);
25+
int i = 0;
26+
//链表1比链表2长
27+
if (diff > 0)
28+
{
29+
while (i < diff)
30+
{
31+
pHead1 = pHead1.next;
32+
i++;
33+
}
34+
}
35+
else
36+
{
37+
while (diff < i)
38+
{
39+
pHead2 = pHead2.next;
40+
diff++;
41+
}
42+
}
43+
44+
ListNode rtNode = new ListNode();
45+
46+
while (pHead1 != null && pHead2 != null)
47+
{
48+
if (pHead1.value == pHead2.value)
49+
{
50+
rtNode = pHead1;
51+
break;
52+
}
53+
else
54+
{
55+
pHead1 = pHead1.next;
56+
pHead2 = pHead2.next;
57+
}
58+
59+
}
60+
61+
return rtNode;
62+
}
63+
64+
private int getListLength(ListNode phead)
65+
{
66+
int count = 0;
67+
while (phead != null)
68+
{
69+
count++;
70+
phead = phead.next;
71+
}
72+
73+
return count;
74+
}
75+
}

0 commit comments

Comments
 (0)