问题陈述 我将尝试通过一个场景来详细说明该案例。让我们以这个问题为例。 链接到问题:https://leetcode.com/problems/remove-element/ 给出一个数组 不要为另一个数组分配额外的空间,必须通过使用O(1)额外的内存就地修改输入数组来做到这一点。 示例:给定 可以更改元素的顺序。离开什么都没关系
超出了新的长度。 我的方法 第1步:确定所有与给定目标相等的元素,并将它们移到数组的右侧,同时保持一个计数器。 第2步:从右侧删除所有元素。 步骤3: 以下是相同的实现: 要点-1:绝对有意义,因为数组 要点-2:这些行对数组 要点-3:给出错误。我了解输入参数(数组 如果我可以选择创建一个新数组,则不会有任何问题。但是,如果需要通过在调用方法中添加/删除元素(如在此问题中)来返回修改后的数组,该如何在Scala中实现呢? 要使情况更通用,我们可以在Scala方法中修改输入集合(作为参数传递)的方式是什么? 附言::如果我没有从输入数组中删除元素,LeetCode将失败,并显示以下消息: 答案 0 :(得分:0) 如何修改通过引用传递给方法的输入数组? Scala不支持传递引用。默认值为按值传递(或更确切地说,按值传递的特殊情况,有时称为按对象调用,按共享调用或按对象共享调用)。 Scala还支持按名称呼叫。 因此,您只能不能在Scala中通过引用将数组传递给方法。您将不得不使用另一种支持传递引用的语言,例如C#(带有
nums
和一个值target
,删除所有的实例
该值就位并返回新长度。nums = [0,1,2,2,3,0,4,2]
,target = 2
; output =
5
(不等于目标的元素数)并将数组修改为
[0,1,3,0,4]
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)
}
}
nums
在main方法的范围内,因此,该语句将用作魅力。nums
没有影响。 nums
)的类型为val
(即通过引用传递,因此在方法removeElement
的范围内是不变的)。 1 个答案:
ref
关键字)或C ++。 (请注意,Java也不支持引用传递。)