7.6

算法

27.移除元素

本题使用双指针,但是呢个人还是觉得抽象,后面看了别人的题解,总结一句话说:把 nums 中的不等于 val 的数,依次填在 0,1,2,⋯ 这些下标上。 这下使用双指针的思路一下清晰很多了

func removeElement(nums []int, val int) int {
	k := 0 
	for _, value := range nums {
		if val != value {
			nums[k] = value
			k++
		}
	}
	return k
}

26.删除有序数组中的重复项

思路类似于上述27,但是略有不同。

初始化 k=1,表示需保留的元素要填入的下标。

从 i=1 开始遍历 nums。

如果 nums[i]=nums[i−1],那么 nums[i] 是重复项,不保留。

如果 nums[i]=nums[i−1],那么 nums[i] 不是重复项,保留,填入 nums[k] 中,然后把 k 加一。

遍历结束后,k 就是 nums 中的唯一元素的数量,返回 k

func removeDuplicates(nums []int) int {
	k := 1
	for i := 1; i < len(nums); i++ {
		if nums[i] != nums[i-1] {
			// 保留
			nums[k] = nums[i]
			k++
		}
	}
	return k
}

80.删除有序数组中的重复项 II

在解体的时候思考了快慢指针,也思考了计数,但是写的乱七八糟的。后面借鉴了别人的思路才捋清楚。本题也是使用了快慢指针的一个思路,给定数组是有序的,所以相同的元素必然连续。利用快慢指针遍历数据每个元素判断是否应该被保留。slow慢指针用于处理出数组的长度(记录下一个需要填充的索引值),fast快指针表示已经检查过的数组的长度,即 nums[fast] 表示待检查的第一个元素,nums[slow−1] 为上一个应该被保留的元素所移动到的指定位置。

将本题变换成更具有一般性,换成相同元素最多出现k次,所以我们需要检查前k个应该被保留的元素nums[slow-k]是否和当前待检查元素nums[fast]相同,当且仅当 nums[slow−k] == nums[fast] 时,当前待检查元素 nums[fast] 不保留(因为此时必然有 nums[slow−k] ==nums[slow−k+1]==nums[fast])。最后,slow 即为处理好的数组的长度

特别地,数组的前k个数必然可以被保留,因此对于长度不超过 k 的数组,我们无需进行任何处理,对于长度超过 k 的数组,我们直接将双指针的初始值设为 k 即可。

func removeDuplicates(nums []int) int {
	k := 2 // 保留几位重复项
	slow, fast := k, k
	l := len(nums)
	if l <= k {
		return l
	}
	for ; fast < l; fast++ {
		// 检查前 k 个应该被保留的元素nums[slow-k]是否和当前待检查元素nums[fast]相同
		// 相同则忽略,不同则保存
		if nums[slow-k] != nums[fast] { 
			nums[slow] = nums[fast]
			slow++
		}
	}
	return slow
}

专项

1. try括号中有return语句,finally执行顺序在return前执行,“假设利用 return 语句从 try 语句块中退出。在方法返回前,finally子句的内容将被执行。如果 finally 子句中也有一个 return 语句,这个返回值将会覆盖原始的返回值。” 确切的说是在return执行的中间,return执行到中间的时候发现finally,则先不返回,把值暂存到本地栈,等finally运行之后,如果finally里有返回语句,那么以finally为主,否则才把本地栈里的返回值真的返回

2.一个类在实现接口的时候

  1. 必须实现接口中所有的方法:在实现类中实现接口时,方法的名字、返回值类型、参数的个数及类型必须与接口中的完全一致,并且必须实现接口中的所有方法。
  2. 接口实现类相当于子类,子类的访问权限是不能比父类小的:接口中所有方法默认都是public,至于为什么要是public,原因在于如果不是public,那么只能在同个包下被实现,可访问权限就降低很多了,那么在实现类中,实现的类相当于子类,子类的访问权限是不能比父类小的,而在java中一个类如果没有权限的修饰符,默认是friendly(同一个包内的其它类才可访问),所以在实现类中一定要写public

在实现类中实现接口时,方法的名字、返回值类型、参数的个数及类型必须与接口中的完全一致,并且必须实现接口中的所有方法。

3.在JDK1.7中,抽象类与接口的联系与区别

A,抽象类可以有普通成员变量,接口中只能有final类型的成员变量 B,都可以包含静态成员,这方面没有特殊规定 C,java是单继承的,就是只能有一个直接父类,但是可以实现多个接口 D,接口中只能声明方法,不能定义方法体,也就是方法都是抽象的

在JDK1.8后,接口可以包含default方法

4.抽象类的相关知识点

1、abstract类不能用来创建abstract类的对象;

2、final类不能用来派生子类,因为用final修饰的类不能被继承;

3、如2所述,final不能与abstract同时修饰一个类,abstract类就是被用来继承的;

4、类中有abstract方法必须用abstract修饰,但abstract类中可以没有抽象方法,接口中也可以有abstract方法。

#每日一练#
备战校招 - 努力中 文章被收录于专栏

备战校招每日学习记录

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务