`所以,我对F#很新。我希望这个问题很简单。我一直在研究和环顾四周。我在表达式中或之前有一个"不完整的结构化构造"错误。我觉得这可能是简单的事情,或者我离开了。
目标是:
有一组非负整数。第二个数组是 通过改组第一个元素形成 数组并删除随机元素。给定这两个数组,找到第二个数组中缺少的元素 阵列。不允许进行线性搜索。
let FindMiss list =
match list with
| [] ->
[]
|firstElem::otherElements ->
let rand = new Random
let shuffle (arr : 'a array) =
let array = Array.copy arr
let n = array.Length
for x in 1..n do
let i = n-x
let j = rand.Next(i+1)
let tmp = array.[i]
array.[i] <- array.[j]
array.[j] <- tmp
array
return array
array.[rand].delete
|array::list ->
let d=collections.defaultdict(int)
for num in list do
d[num] +=1
for num in array1 do
if d[num]==0 then return num
else d[num]-=1
printfn "The missing Number is: %A" (FindMiss[4;2;1;7;5;6;3;2])
答案 0 :(得分:1)
任务是重新实现List.except?
如果没有,只需使用'除'然后:
[1;2;3] |> List.except [1;2]
或者任务是“随机删除列表中的元素”?那就是“答案”:https://stackoverflow.com/a/2889972/5514938
答案 1 :(得分:0)
首先,为了提高可读性,您可以在一个单独的函数中进行混洗和删除随机元素。对于数组,它们可能如下所示:
let Shuffle arr =
let rand = System.Random()
arr |> Array.sortBy(fun _ -> rand.Next())
let RemoveRandom arr =
let rand = System.Random()
let lng = arr |> Array.length
let index = rand.Next lng
[|0..lng - 1 |]
|> Array.choose(fun x -> if x = index then None else Some(arr.[x]))
|> Shuffle
进一步定义搜索功能:
let FindMiss arr1 arr2 =
let sum1 = arr1 |> Array.sum
let sum2 = arr2 |> Array.sum
sum1 - sum2
示例:
let first = [| 4;2;1;7;5;6;3;2 |]
first |> printfn "%A"
let second = first |> RemoveRandom
second |> printfn "%A"
FindMiss first second |> printfn "Missing value is %i"
打印:
[|4; 2; 1; 7; 5; 6; 3; 2|]
[|2; 2; 3; 7; 1; 5; 6|]
Missing value is 4
链接: