1 day
数组理论基础
数组是存放在连续内存空间上的相同类型数据的集合。
数组下标都是从0开始的。
正是因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。(弊端)
数组的元素是不能删的,只能覆盖。
那么二维数组在内存的空间地址是连续的么?
在C++中二维数组在地址空间上是连续的。
像Java是没有指针的,同时也不对程序员暴露其元素的地址,寻址操作完全交给虚拟机,所以看不到每个元素的地址情况,做一个实验。
public static void test_arr() { int[][] arr = {{1, 2, 3}, {3, 4, 5}, {6, 7, 8}, {9,9,9}}; System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); System.out.println(arr[3]); }
输出的地址为:
[I@7852e922 [I@4e25154f [I@70dea4e [I@5c647e05
这里的数值也是16进制,这不是真正的地址,而是经过处理过后的数值了,我们也可以看出,二维数组的每一行头结点的地址是没有规则的,更谈不上连续。
所以Java的二维数组可能是如下排列的方式:
收获
之前其实对二维数组一直有所疑惑,今天突然想到arr[0],arr[1]这样输出的是什么东西。直到问了彷徨,他的一句话讲明白了。“Java实际上没有多维数组,只有一维数组。多维数组被解释为‘数组的数组’ ”。也算是对上面这张图的深入理解把。
704.二分查找
目标:熟悉 根据 左闭右开,左闭右闭 两种区间规则 写出来的二分法。
题目:
二分法主要的难点在于 while (left <= right) ,何时是 <=,何时是 <。其次是 if (nums[middle] > target) right 何时赋值为 middle - 1,何时赋值为 middle。
而如何判断就在于对不变量(就是区间)的选择与理解。
收获
length 和 size()的区别
length 是属性,size()是方法
-
length :表示的是数组的长度 数组
-
length():表示的是字符串的长度 字符串
-
size():表示的是集合中有多少个元素 集合
分清描述的“对象”是什么就行
= 是赋值 ,==才是判断是否相等(返回的是布尔值)
27.移除元素
双指针法 是本题的精髓
题目:
收获
通过本题我最大的收获就是提高了 debug 的能力,因为本题的暴力解法我用到了大量的 for 循环,但是一直在出错找不到出错的原因,就只能用 idea 的 debug 来一步步进入 for 循环来看问题出现在了哪里。