public class Solution {
public static void main(String[] args) {
getDeliciousDrink().taste();
System.out.println(getWine().getCelebrationName());
System.out.println(getSparklingWine().getCelebrationName());
System.out.println(getWine().getCelebrationName());
}
/*
补全代码
4.编写 getDeliciousDrink、getWine 和 getSparklingWine 方法的实现。
Solution 类必须实现 getDeliciousDrink() 方法,该方法返回 Wine 对象。
Solution 类必须实现 getWine() 方法,该方法返回 Wine 对象。
Solution 类必须实现 getSparklingWine() 方法,该方法返回 SparklingWine 对象。
*/
}
给的题目部分内容要求是这样的,网上搜出来incrByTen()是返回对象的,但是没理解怎么用,比如返回值应该设定啥?
从题目需求分析,大概可以拆分以下几个部分:
如果incrByTen()
是返回对象的,那么你可以在实现中创建一个新的对象,对其进行操作并返回。
举个栗子:如果你有一个MyNumber对象,其中包含一个整数值value。
那么,你可以实现一个incrByTen() 方法,使其返回一个新的MyNumber对象,该对象的值为当前对象的值加上10,
代码如下:
public MyNumber incrByTen() {
MyNumber result = new MyNumber(this.value + 10);
return result;
}
首先创建一个名为result的新对象,它的值为当前对象的值加上 10。然后,我们返回这个新的对象。这样,调用incrByTen()方法将返回一个新的MyNumber对象,它的值是当前对象的值加上10。
如果答案对您有所帮助,望采纳。
首先理解题目,抓住给的重要条件
1、已经排好序的数组
题目给的已知条件就这一条,然后再来看一下我们要达到的目的
1、返回新数组的长度
2、新数组在这个长度里,同一个元素不能出现2次以上
3、不允许使用额外的数组空间
知道了现在有什么,知道了要达到什么目的,接下来要做的就是怎么才能到达目的地
如果是使用JS,那么找到重复次数2次以上的数,当第三次出现的时候直接移除就OK了
如果使用Go语言,因为无法直接对数组里的元素进行删除操作,那么我们就只能像上周那样,将整个数组重新整合,把后面的数据移动到前面来
不管是将重复2次以上的数据删除,还是移动元素,我们现在面临的问题都是如何找到重复了2次以上的数字
找到阻拦我们去目的地的障碍是什么之后,现在要做的就是解决路上的拦路石,怎么做呢?当然是从已知的条件里去找,看有没有什么能用上的。
已知的信息就相当于我们出远门身上带的炸药包,路上遇到打劫的山贼,不拿出来使使,那些山贼们怎么会知道咱们的厉害呢?
现在我们知道已知条件是「已排序好的数组」,既然已经排好序了,那么排好序有什么作用呢?现在是递增排序,那排好序后的数组特性就是,后面的数比前面的数要大,如果后面的数是重复的数字,就意味着后面的数等于前面的数
所以,只要当后面的数等于前面的数时,我们就知道这个数重复了。你可能会说,那也只是知道重复了一次啊,怎么判断重复了2次呢?
这就是一个思维定势了,谁告诉你只能找后面一个数的?我就不能找后面2个数了?也就是说,当我nums[0]==nums[2]
时,不就代表nums[0]
的值已经出现3次了?所以nums[2]
以及它后面同样的数值,都是我们要抛弃的东西
所以,在解决问题时,要充分的发挥已知条件的作用。
好了,思路已经理的差不多了,接下来的思路就是要进行Code实现,Code实现,不同的语言就有着不同的实现方式,这次咱们还是老规矩,说两种语言
咱们来看看代码实现,代码实现的思路讲解我放在了代码注释里
/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function (nums) {
let j = 0, i = 2;// 间隔1个元素
for (; i < nums.length; i++) {
// nums[i]与nums[j],中间间隔了一个nums[i-1]
if (nums[j] === nums[i]) {
// 当nums[j]==nums[i]时,代表这个数已经是第三次出现,所以要删除
nums.splice(i, 1);
// 删除一个元素后,用于遍历的游标i要-1
// 意味着被删除的元素后面的内容要往前面移动一位,所以游标只要保持不动,就能找到下一位数
i--;// i-- 只是为了抵消for 循环的 i++
} else {
j++;
}
}
return i;
};
下图是JS代码提交的返回结果,拿来娱乐娱乐
看来这次我的JS解法写的还不错,容我膨胀一下,看来我的这个思路比大多数人的方案都要优秀呀
好了,老规矩,用你们熟悉的JS写了之后,咱们来复习复习Go语言的使用
Go语言的实现我稍稍优化了一下下,虽然没点luan用
func removeDuplicates(nums []int) int {
// 因为最多元素可重复2次,所以前2个数不用管
if len(nums) < 3 {
return len(nums)
}
// 定义2个游标 i,j
j, i := 2, 2,// i 用于遍历数组,j 用于记录长度
for ; i < len(nums); i++ {
if nums[j-2] != nums[i] {
// 因为不相等就意味着不重复
// 直接将后面的值替换到前面来就好了
nums[j] = nums[i]
j++
}
}
return j
}
之所以再用Go语言来写一遍,是因为Go语言与JS的实现思路略有不同,所以这次我觉得还是写的有点价值的
毕竟在语言没有直接删除数组元素的方法的情况下,这道题的难度又略微增加了一点
有心的读者应该会发现,这次我没有使用range
来迭代数组,就是不同的写法能让你们对Go语言能有个不同的印象