Skip to content

Commit 4e9cb7a

Browse files
committed
change image
1 parent 90bef57 commit 4e9cb7a

12 files changed

Lines changed: 186 additions & 137 deletions

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ Github项目主页:https://github.com/NotFound9/interviewGuide
4242
- [10.Java中的内部类是怎么样的?](docs/JavaBasic.md#Java中的内部类是怎么样的?)
4343
- [11.Java中的注解是什么?](docs/JavaBasic.md#Java中的注解是什么?)
4444
- [12.为什么hashCode()和equal()方法要一起重写?](docs/JavaBasic.md#为什么hashCode()和equal()方法要一起重写?)
45-
- [13.Java 中有哪些数据类型](docs/JavaBasic.md#Java 中有哪些数据类型?)
45+
- [13.Java中有哪些数据类型](docs/JavaBasic.md#Java中有哪些数据类型)
4646
- [14.包装类型和基本类型的区别是什么?](docs/JavaBasic.md#包装类型和基本类型的区别是什么?)
4747
* 容器
4848
- [ArrayList和LinkedList](docs/ArrayList.md)

docs/ArrayList.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#### [1.ArrayList与LinkedList的区别是什么?](#ArrayList与LinkedList的区别是什么?)
66

77
#### [2.怎么使ArrayList,LinkedList变成线程安全的呢?](#怎么使ArrayList,LinkedList变成线程安全的呢?)
8+
89
#### [3.ArrayList遍历时删除元素有哪些方法?](#ArrayList遍历时删除元素有哪些方法?)
910
#### [4.ConcurrentModificationException是什么?](#ConcurrentModificationException是什么?)
1011

@@ -38,8 +39,6 @@ public void add(int index, E element) {
3839
}
3940
```
4041

41-
42-
4342
#### 3.插入和删除的复杂度:
4443

4544
* ArrayList 采用数组存储,元素的物理存储地址是连续的,支持以O(1)的时间复杂度对元素快速访问。插入和删除元素后,需要将后面的元素进行移动,所以插入和删除元素的时间复杂度受元素位置的影响。复杂度是 O(n),

docs/CodingInterviews.md

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -959,7 +959,6 @@ public RandomListNode Clone(RandomListNode pHead)
959959

960960

961961
}
962-
963962
//设置新链表的特殊指针
964963
RandomListNode oldCurrentNode= pHead;
965964
RandomListNode newCurrentNode;
@@ -997,6 +996,7 @@ public RandomListNode Clone(RandomListNode pHead)
997996

998997

999998
## 题025 二叉搜索树与双向链表
999+
10001000
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
10011001

10021002
二叉搜索树的中序遍历的结果就是递增的序列,所以递归实现二叉搜索树的中序遍历
@@ -1169,19 +1169,19 @@ f(n) 有两种取值
11691169
if(array==null || array.length==0) {
11701170
return 0;
11711171
}
1172-
int max=array[0];
11731172
int currentSum = array[0];
1173+
int maxSum = currentSum;
11741174
for (int i = 1; i < array.length; i++) {
11751175
if (currentSum<0) {
11761176
currentSum = array[i];
11771177
} else {
11781178
currentSum = currentSum + array[i];
11791179
}
1180-
if (currentSum>max) {
1181-
max = currentSum;
1180+
if (currentSum>maxSum) {
1181+
maxSum = currentSum;
11821182
}
11831183
}
1184-
return max;
1184+
return maxSum;
11851185
}
11861186
```
11871187

@@ -1191,7 +1191,7 @@ f(n) 有两种取值
11911191

11921192
解法一,就是对1到n进行遍历,对每个数统计该数1出现的次数,统计时用这个数x%10,判断个位数是否为1,然后用x=x/10的结果继续%10来进行判断个位数为1,一直到x=0,统计到x包含1的个数,这样的话,一共有N个数,每个数计算的时间复杂度log10 N,总时间复杂度是N*log10 (N)也就是Nlog(N)
11931193

1194-
解法二:还是对1到n进行遍历,对每个数统计该数1出现的次数,将每个数转换为字符串,判断字符串包含字符"1"的个数,但是将数字转换为字符串的这个过程,由于使用了StringBuffer的append()方法,然后使用了Integer的getChars方法,复杂度还是Log100 (N),所以总复杂度还是Nlog(N)
1194+
解法二:还是对1到n进行遍历,对每个数统计该数1出现的次数,将每个数转换为字符串,判断字符串包含字符"1"的个数,但是将数字转换为字符串的这个过程,由于使用了StringBuffer的append()方法,然后使用了Integer的getChars方法,复杂度还是Log10 (N),所以总复杂度还是Nlog(N)
11951195

11961196
```java
11971197
public int NumberOf1Between1AndN_Solution(int n) {
@@ -1258,7 +1258,9 @@ public Boolean compare(int a, int b) {
12581258

12591259
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
12601260

1261-
第一个丑数是1,除了1以外,其他丑数都是2,3,5之间相乘得到的,也就是丑数的因子都是2,3,5,
1261+
1 2 3 5
1262+
1263+
第一个丑数是1,除了1以外,其他丑数都是2,3,5之间相乘得到的,也就是丑数的因子都是2,3,4,5,6,
12621264

12631265
第一种解决方案就是从1开始对所有整数遍历,将每个数一直除以2,3,5,看能否除尽,能除尽代表是丑数,一直得到第N个丑数。
12641266

@@ -1276,13 +1278,12 @@ public int GetUglyNumber_Solution(int index) {
12761278
int temp5 = array[index5]*5;
12771279
int minTemp = temp2 < temp3 ? temp2 : temp3;
12781280
minTemp = minTemp < temp5 ? minTemp : temp5;
1279-
12801281
if (temp2 == minTemp) {
12811282
index2++;
12821283
}
12831284
if (temp3 == minTemp) {
12841285
//可能存在一个丑数可以由多种丑数相乘得到,
1285-
// 例如6可以是2*2*2,也可以是2*3,所以这里的三个if需要分开判断赋值
1286+
// 例如12可以是6*2,也可以是4*3,所以这里的三个if需要分开判断赋值
12861287
index3++;
12871288
}
12881289
if (temp5 == minTemp) {
@@ -1334,7 +1335,7 @@ public int GetUglyNumber_Solution(int index) {
13341335

13351336
对于%100的数据,size<=2*10^5
13361337

1337-
逆序对就是前面的数比后面的数大,就是一个逆序对,可以使用归并排序,每次组合并时,右边的组的数比左边的数小时,会出现逆序对,逆序对的个数为左边的组的数组元素个数
1338+
逆序对就是前面的数比后面的数大,就是一个逆序对,可以使用归并排序,每次组合并时,右边的组的数比左边的数小时,会出现逆序对,逆序对的个数为当前左边的组的元素个数
13381339

13391340
```java
13401341
public int InversePairs(int [] array) {
@@ -1385,7 +1386,7 @@ public int inversePairsort2(int[] array, int left, int right, int[] temp) {
13851386
}
13861387
```
13871388

1388-
思路就是先递归对数组进行分组,一直到每个组只有一个元素,然后每个组按大小进行合并,形成一个新的组。每次合并的时间复杂度是N,大概需要合并log(N)次,所以总时间复杂度是 Nlog(N)这样写简单是简单,就是空间复杂度太高了,每次创建新数组,空间复杂度是Nlog(N)
1389+
思路就是先递归对数组进行分组,一直到每个组只有一个元素,然后每个组按大小进行合并,形成一个新的组。每次合并的时间复杂度是N,大概需要合并log(N)次,所以总时间复杂度是 Nlog(N)这样写简单是简单,就是空间复杂度太高了,每次创建新数组,空间复杂度是Nlog(N)
13891390

13901391
```java
13911392
public static int[] sort(int[] array,int start, int end) {
@@ -1869,7 +1870,7 @@ public static void qsort(int[] array, int start ,int end) {
18691870
假设一开始有n个数,每个人的编号为0到n-1,让数到m的人出局,假设出局的人的编号为k,那么k=(m-1)%n;
18701871
在n个人中间报数时,每个人的编号是
18711872
0 1 2 ... k k+1 k+2 ... n-1
1872-
当k出局以后,在n-1个人中报数时,每个人的编号是重新从k+1开始计数
1873+
当k出局以后,在n-1个人中报数时,每个人的编号是重新从k+1开始计数,原来的编号就映射为下面这样了(原来k+1变成了0,原来的n-1变成了n-1-(k+1))
18731874
n-k+1 ... 0 1 ... n-1 -(k+1)
18741875
所以假设从n-1报数时的编号到n个人报数时的编号存在一个映射关系
18751876
假设f(n)代表n个人报数编号
@@ -1882,7 +1883,7 @@ n>1时,f(n)=(f(n-1)+m)%n
18821883

18831884
所以就是按照这个公式从2计算到n,得到f(n)
18841885

1885-
```
1886+
```java
18861887
public int LastRemaining_Solution(int n, int m) {
18871888
if (n<1|| m<1) {
18881889
return -1;
@@ -1958,7 +1959,7 @@ public int Add(int num1,int num2) {
19581959

19591960
-2147483648 至 2147483647
19601961

1961-
-2的31次方 2的31次方-1
1962+
-2的31次方 2的31次方-1
19621963

19631964
```java
19641965
public static int StrToInt(String str) {
@@ -2061,7 +2062,7 @@ public int[] multiply(int[] A) {
20612062
就是使用一个数组来记录字符出现的次数。
20622063

20632064
```java
2064-
StringBuffer str = new StringBuffer();
2065+
StringBuffer str = new StringBuffer();
20652066
int[] table = new int[256];//记录出现次数,0代表0次,1代表1次,2代表2次及2次以上
20662067
public void Insert(char ch)
20672068
{
@@ -2230,21 +2231,21 @@ public ListNode deleteDuplication(ListNode pHead)
22302231

22312232
所以当前节点的中序遍历中的下一个节点是
22322233

2233-
1.有右子树
2234+
1.当前节点有右子树
22342235

22352236
​ 右子树有左节点,一直向下遍历,找到最左的叶子节点。
22362237

22372238
​ 右子树没有左节点,就是右子树节点。
22382239

2239-
2.没有右子树
2240+
2.当前节点没有右子树
22402241

22412242
​ 没有父节点,那么没有下一个节点。
22422243

2243-
有父节点
2244+
这个节点有父节点
22442245

2245-
父节点是左子树,直接返回父节点。
2246+
这个节点父节点是属于左边分支的,直接返回父节点。
22462247

2247-
父节点是右子树,一直向上遍历,直到找到一个父节点,他是祖先节点是左节点的,找到就返回祖先节点,找不到就返回空。
2248+
这个节点父节点是属于右边分支的,一直向上遍历,直到找到一个父节点,他是祖先节点是左节点的,找到就返回祖先节点,找不到就返回空。
22482249

22492250
```java
22502251
public TreeLinkNode GetNext(TreeLinkNode pNode)

docs/JavaBasic.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
#### [12.为什么hashCode()和equal()方法要一起重写?](#为什么hashCode()和equal()方法要一起重写?)
2727

28-
#### [13.Java 中有哪些数据类型](#Java 中有哪些数据类型?)
28+
#### [13.Java中有哪些数据类型](#Java中有哪些数据类型)
2929

3030
#### [14.包装类型和基本类型的区别是什么?](#包装类型和基本类型的区别是什么?)
3131

@@ -698,7 +698,7 @@ RuntimeException以外的异常可以认为是编译时异常,从程序语法
698698

699699
@Transaction默认检测异常为RuntimeException及其子类,如果有其他异常需要回滚事务的需要自己手动配置,例如:@Transactional(rollbackFor = Exception.class)
700700

701-
### Java 中有哪些基本数据类型
701+
### Java中有哪些基本数据类型
702702

703703

704704
| 类型 | 字节数 | 取值范围 |

0 commit comments

Comments
 (0)