设计链表
今天发了几个小时就看了这么一道题目,深深感受到了链表中的临界思维的恶心之处,和一些我以前有一些误区的地方和之前没学习到的知识点,记录一下,狗屎
题目
你可以选择使用单链表或者双链表,设计并实现自己的链表。我使用的是单链表
单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。
如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。
实现 MyLinkedList 类:
MyLinkedList() 初始化 MyLinkedList 对象。
int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。
void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
void addAtIndex(int index, i ...
链表
定义
1234type LinkNode struct{ Val int Next *LinkNode struct}
移除链表元素
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例 1:
12输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]
示例 2:
12输入:head = [], val = 1输出:[]
示例 3:
12输入:head = [7,7,7,7], val = 7输出:[]
我的答案:我是设置了p,q两个指针,一前一后
比较的时候要用后面的指针进行比较,因为删除操作要跳跃一个元素
因为删除元素的地方要分为 头部,中间,尾部三个地方,所以我特地分了三种情况(看了标准答案后发现我是傻逼,因为某个写法跟我很相似,但是能囊括三种情况)
整体代码有冗余,还很长,看一下标准版本的
12345678910111213141516171819202122232425262728293031func remov ...
Go圣经-map
Map
创建1234567891011// 第一种c:= make (map[string]int)// 第二种c := map[string]int{"ok":1,"error":-1}// 第三种var c map[string]int// 万能好用写法: 使用空接口可以实现连键值都是类型不一样的c := map[string]interface{}{ "ok":"ok", "err":"-1"}
增加直接通过索引增加(同数组)
删除使用内置的delete()函数
12delete(ages, "alice")// 第一个写变量名,第二个写键
查询直接通过索引查询(同数组)
比较不能使用== 来比较
用for range 一个个比较(同切片)
复制不能直接复制
用for range 一个个复制(同切片)
修改直接用索引来修改(同数组 ...
Go圣经-slice
变量-常量-字面量
1234a := 1const b int = 1// a 变量 b 常量 1 字面量// 综上所述 字面量就是等号后面的数据
数组
Go内置的函数**len()**可以返回数组的元素个数
[…]int “…”省略号出现在数组长度的位置,数组的长度就由初始化数组的元素个数决定
[3]int与[4]int是不同的类型,并且 数组长度的位置必须是常量表达式
[…]int{99:-1},表示总共由一百个元素,第九十九个为-1,其他都为0
[5]string{1: “ok”, 2: “o” } 这里的起始位置就是索引为1的地方
数组作为形参的时候,是另外创建一个副本,是值传递的形式,要与其他语言分开来
要实现地址传递,直接使用数组指针,*[9]int
slice
slice表示一个拥有相同类型原始的可变长度的类型
指针 长度 容量
长度和容量切片的长度就是它所包含的元素个数。
切片的容量是从它的第一个元素开始数,到其底层数组元素末尾的个数。
切片可以按需自动增长和缩小,增长一般使用内置的 append 函数来实现,而缩小则是通过对切片再次 ...
图解HTTP-网络基础
Web
web(world wide wed) 是全球广域网,也成为万维网,它是基于超文本,HTTP协议,全球性的分布式图形信息系统,一般来说Web也可以认为是浏览器
TCP/IP协议簇
TCP/IP协议簇 并不是单单指的是 TCP和IP协议
它是一个四层协议系统,自顶向下分别是应用层,传输层,链路层和物理层
应用层应用层决定了向用户提供应用服务时通信的活动
传输层传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输
网络层网络层用来处理网络上流动的数据包。
链路物理层处理连接网络的硬件部分
通信大致过程
数据的封装
IP协议
IP(Internet Protocol),就是那么高大上,其作用就是把各种数据包传送给对方。
要确保数据包能够确实传送到对方,需要IP地址和MAC地址(Media Access Control Address)
ARP协议IP间的通信依赖MAC地址,在通信中转的情况中,会利用中转设备的MAC地址搜索下一个中转目标,这是就会采用ARP协议(Address Resolution Protocol),ARP是一种解析地址的协议,根据通 ...
数组
今天开始刷题,记录一下 23.12.28
二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:
123输入: nums = [-1,0,3,5,9,12], target = 9输出: 4解释: 9 出现在 nums 中并且下标为 4
示例 2:
123输入: nums = [-1,0,3,5,9,12], target = 2输出: -1解释: 2 不存在 nums 中因此返回 -1
解题12345678910111213141516func search(nums []int, target int) int { length := len(nums) left := 0 right := length - 1 for(left<= right){ middle := (left+right)/2 if nums[middle]>target{ ...
Go圣经-字符串
字符串
字符串不可改变
s[0]=’L’ 这种操作是不行的
但是可以通过 s += “, right foot”改变
原生的字符串字面量的书写形式是 一对反引号,而不是双引号。
原生的字符串字面量可以展开多方,但是回车符会被删除
适用于HTML模板,JSON字面量,命令行提示信息
就可以解释JSON结构体的tag字段了。
ASCII 字符集
为美国人而设计的字符集,包含了英文字母和一些其他字符,用一个字节代表一个字符,第一个数一定为零,其余七位总共有一百二十八个选择
GBK字符集
中国人加入战场,用两个字节代表一个字符,同时还兼容ASCII字符集,因为它第一个数字是一就代表了GBK字符集,如果第一个字符是0,就代表是ASCII码,也好分辨
Unicode字符集
囊括了世界上所有文书体系的全部字符
UTF-32的编码方式:用4个字节表示一个字符(不合适),占内存
UTF-8的编码方式:采取可变长变化反感,共分为四个长度区,1,2,3,4字节
英文,数字字符占一个字节,汉字字符占用三个字节
一个文字字符符号编码的首字节的高位知名了后面还有多少 ...
Go圣经-类型转换
Go语言中的类型转换有四种
显示转换:强制转换
隐式转换:数值的初始化赋值传参时会完成,或者接口结构体的使用中
类型断言:接口的类型断言,必须时接口
Unsafe.pointer:–
显示转换123//最简单的var a int //设置了a的类型为int 哈哈哈
12345// 同类型的转换 数字类型之间的转换,切片和字符串的转换是允许的var a int64var b int32fmt.Println("Type(a) = %T, Type(b) = %T \n",a,int64(b))
123456// 不同类型的转换 int ->stringvar a int64var b stringb = strconv.Itoa(a)fmt.Println("a= %d , b= %c \n",a,int64(b))//不同类型的转换需要使用strconv包,具体使用看官方文档
隐式转换
传统初始化赋值编译器就会自动实现转换
a := 1 a自动被认为是 int
在Go中,如果一个结构体满足 ...
Go圣经-程序设计
程序设计
名称驼峰式 ,其他与C差不多
声明
var
const
type
func
变量
常量
类型
函数
变量var name type = expression
name := expression
var name type
一般用 :=,如果不赋值就用第三个,如果未初始化变量,Go会自动的对应于相应类型的零值,对于复合类型的变量,零值就是所有元素或成员的零值,但是全局变量的时候不能使用短变量,必须带上var
var a ,b ,c int // int int int
var a ,b ,c = bool , int ,string // bool ,int ,string
a,b := 0 , 0.0
指针*type 可以间接访问
有意思的一个包
123456789101112131415161718192021222324252627package mainimport ( "flag" "fmt" " ...