奈何最近未找到合适的记录软件,就暂时把自己的博客改造成学习笔记。由于出发点是供个人学习,可能层次不清,还望见谅。
目前的学习网站是leecode
https://leetcode-cn.com/leetbook/read/array-and-string/ybfut/
集合,列表和数组
集合:由一个或多个确定的元素所构成的整体。
{1. 集合里的元素类型不一定相同 2. 集合里的元素没有顺序 }
列表(线性列表):是一种数据项构成的有限序列,即按照一定的线性顺序,排列而成的数据项的集合。
列表最常见的表现形式有数组和链表,而栈和队列则是两种特殊类型的列表。
数组有一个非常重要的概念,索引
数组的操作
数组的四种操作: 读取元素, 查找元素, 插入元素, 删除元素
读取元素: 通过访问索引的方式来读取的,索引一般从0开始。计算机内存储数组会在一段**连续**的空间,并且会记下索引为0处的内存地址。
1.找到该数组的索引0的内存地址
2.将内存地址加上索引值。
时间复杂程度是常数级别,O(1)
查找元素
从头到尾O(N)
插入元素
挪一挪,腾地方

(链表可以解决这个问题)
删除元素

看一道题目:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
对于我自己的写法,那就是if else走天下,查到了一位小伙伴用二分法的java代码:
class Solution{
public int searchInsert(int[] nums, int target){
int lower = 0;
int higher = nums.length - 1;
int mid = -1;
boolean flag = false;
while(lower <= higher){
mid = (higher + lower) / 2;
if (nums[mid] < target){
lower = mid + 1;
}else if(nums[mid] > target){
higher = mid - 1;
}else {
flag = true;
return mid;
}
}
if (nums[mid] > target){
return mid - 1 >=0 ? mid : 0;
}else{
return mid + 1;
}
}
}
源码来自:https://blog.youkuaiyun.com/qq_41359651/article/details/100591458d
又发现了一个同学用C语言实现,非常简洁,于是乎改成java和大家分享一下:
class Solution {
public int searchInsert(int[] nums, int target) {
int dst = 0;
while(dst < nums.length){
if(nums[dst] < target){
++dst;
}
else{
break;
}
}
return dst;
}
}
C语言源码来自:https://mp.weixin.qq.com/s?src=11×tamp=1596597116&ver=2503&signature=ll7pUjBdIuwNUKB5LqobLVpbCLWfuCJhL4FidxfzUP60Ws0T9aEHOJOfLZmaM2f0mgtkKNlaFPUUdfnJj3q6riMRdzI8KaMXme0T1uv1b0zscl2qTO7qAZoE2I8kCLV&new=1*
补充一个注意点: java的二维数组,e.g. arr[][] ,第一个是行,第二个是每一行的第几列
数组值arr[x][y]表示指定的是第x行第y列的值
数组名后直接加上length(如arr.length),所指的是有几行(Row)
指定索引后加上length(如arr[0].length),指的是该行所拥有的元素,也就是列(Column)数目。
补充: Array.deepToString 可打印二维数组 Array.toString 可打印一维数组
补充: Lambda表达式
//不需要参数,返回值为5
() -> 5
//接收一个参数(数字类型),返回其2倍的值
x -> 2*x
//接受2个参数(数字),并返回他们的差值
(x, y)-> x - y
//接受2个int型整数,返回他们的和
(int x, int y) -> x + y
//接受一个string 对象,并在控制台上打印,不返回任何值
(String s) -> System.out.print(s)