F#在2个数组/列表

时间:2015-10-27 00:25:07

标签: arrays list f# syntax-error shuffle

`所以,我对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])

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

链接:

https://dotnetfiddle.net/g6wKUX