Description

对数组进行频数统计的计数器在不同语言中对应不同的数据结构,虽然在逻辑上都是键值对

  • R. table(arr) 返回一个命名的向量
  • julia. DataStructures.counter() 返回一个 struct,其中包裹的是一个 Dict
  • JavaScript. 可以手写一个对象或 Map,储存 元素:频率 的键值对

Solutions

Julia

## Counting-Duplicates.jl

using DataStructures, Test


"""
    duplicatecount(str)

计算str中出现次数多于1次的字符的个数
"""
#> "    duplicatecount(str)\n\n计算str中出现次数多于1次的字符的个数\n"
function duplicatecount(str::String)::Int64
    dict = str |> lowercase |> counter
    # @show dict

    # broadcast() 的参数可以是 iterator
    # .> 返回 BitVector,可以传给 sum()
    sum(values(dict) .> 1)

    # filter(>(1), [values(dict)...]) |> length # 等价形式
end
#> duplicatecount (generic function with 1 method)



@testset "Sample tests" begin
    @test duplicatecount("") == 0
    @test duplicatecount("abcde") == 0
    @test duplicatecount("aabbcde") == 2
    @test duplicatecount("aabBcde") == 2
    @test duplicatecount("Indivisibility") == 1
    @test duplicatecount("Indivisibilities") == 2
end
#> Test Summary: | Pass  Total
#> Sample tests  |    6      6
#> Test.DefaultTestSet("Sample tests", Any[], 6, false, false)

R

## Counting Duplicates

library(tidyverse)


#' @title 统计字符串中有几个字符的出现次数大于1
duplicate_count <- function(text) {
    frequency <- tolower(text) %>%
        str_split("") %>%
        unlist() %>%
        table()

    # 向量化写法
    sum(frequency > 1)
}


library(testthat)
test_that("Sample Tests", {
    expect_equal(duplicate_count(""), 0)
    expect_equal(duplicate_count("abcdeaa"), 1)
    expect_equal(duplicate_count("Indivisibilities"), 2)
})
#> Test passed 🌈

JavaScript

const Vector = require("../src/JavaScript/toolkit/Vector");


function duplicateCount(text) {

  const dict = Vector.counter(text.toLowerCase());
  return Object.values(dict).filter(x => x > 1).length;
}

console.log(duplicateCount("Indivisibilities"));
#> 2