问题陈述
我将尝试通过场景来详细说明该案例。让我们以这个问题为例。
链接到问题:https://leetcode.com/problems/remove-element/
给出数组
nums
和值target
,请删除该值就位并返回新长度。不要为另一个数组分配额外的空间,必须通过使用O(1)额外的内存就地修改输入数组来做到这一点。
示例:给定
nums = [0,1,2,2,3,0,4,2]
,target = 2
;output = 5
(不等于目标的元素数)并将数组修改为[0,1,3,0,4]
元素的顺序可以更改。离开什么都没关系超出了新的长度。
我的方法
步骤1:确定所有与给定目标相等的元素,并将它们移到数组的右侧,同时保持一个计数器。
步骤2:从右侧删除所有元素。
步骤3:return (n - counter)
,其中n是数组长度,而counter是等于目标的元素数。
下面是相同的实现:
object RemoveElement {
// Link to question: https://leetcode.com/problems/remove-element/
def main(args: Array[String]): Unit = {
var nums = Array(3,2,2,3)
val target = 3
val result = removeElement(nums, target)
// nums = nums.dropRight(_.equals(target)) // POINT 1
println(s"Result: ${result}, Modified Array: [${nums.mkString(", ")}]")
}
def removeElement(nums: Array[Int], target: Int): Int = {
val n = nums.length
var left, counter = 0
var right = n - 1
while(left < right){
if(nums(left) != target){
left += 1
}
else {
// Find position of the elements which is not equal to target
if(nums(right) == target){
counter += 1
right -= 1
}
else{
// Swap the elements
counter += 1
val temp = nums(left)
nums(left) = nums(right)
nums(right) = temp
left += 1
right -= 1
}
}
}
// nums.dropWhile(_.equals(target)) // POINT 2
// nums = nums.dropRight(_.equals(target)) // POINT 3
return (n - counter)
}
}
POINT-1:绝对有意义,因为数组nums
在main方法的范围内,因此,该语句将用作charm。
要点2:这些行对数组nums
没有影响。
要点-3:给出错误。我知道输入参数(数组nums
)的类型为val
(即通过引用传递,因此在方法removeElement
的范围内是不变的)。
如果我可以选择创建一个新数组,就不会有任何问题。但是,如果我需要通过将元素添加/删除(如在此问题中)到调用方法来返回修改后的数组,那么如何在Scala中实现呢?
为了使情况更通用,在Scala方法中修改输入集合(作为参数传递)的方式是什么?
P.S。:如果我不从输入数组本身中删除元素,LeetCode将失败,并显示以下消息:
如何修改通过引用传递给方法的输入数组?
Scala不支持传递引用。默认值为按值传递(或更确切地说,按值传递的一种特殊情况,有时也称为按对象调用,按共享调用或按对象共享调用)。 Scala还支持按名称呼叫。
因此,您只需cannot在Scala中通过引用将数组传递给方法。您将不得不使用另一种支持传递引用的语言,例如C#(带有ref
关键字)或C ++。 (请注意,Java也不支持传递引用。)