【发布时间】:2020-01-28 21:44:35
【问题描述】:
我正在尝试创建一个函数来解决这个难题:
算术级数定义为给定数字序列的连续项之间存在恒定差异的级数。为您提供算术级数的连续元素。但是有一个问题:给你的一组数字中恰好缺少原始系列中的一个术语。给定系列的其余部分与原始 AP 相同。找出缺失的术语。
你必须编写函数 findMissing(list),list 总是至少有 3 个数字。缺少的词永远不会是第一个或最后一个。
下一段代码展示了我对这个函数的尝试。我所在的站点针对该函数运行测试,所有测试都通过了,因为它们输出了正确的缺失整数。
我面临的问题是它给了我一个超时错误,因为运行所有测试需要很长时间。有 102 个测试,据说完成它们需要超过 12 秒。耗时超过 12 秒意味着该功能不够高效。
在 RStudio 中运行我自己的计时测试后,运行该函数所需的时间似乎比 12 秒要少得多,但无论如何我需要提高效率才能完成难题。
我在网站论坛上问过,有人说“排序很贵,想想没有它的另一种方法。”我认为这意味着我不应该使用 sort() 函数。这是他们的意思吗?
我已经找到了几种不同的方法来获取使用 sort() 函数计算的 my_diff。所有这些方式都比原来的方式效率更低。
无论如何,能否给我一种更有效的方式来查找 my_diff 或让代码的其他部分更有效?虽然 sort() 部分显然是代码效率低下的部分。
find_missing <- function(sequence){
len <- length(sequence)
if(len > 3){
my_diff <- as.integer(names(sort(table(diff(sequence)), decreasing = TRUE))[1])
complete_seq <- seq(sequence[1], sequence[len], my_diff)
}else{
differences <- diff(sequence)
complete_seq_1 <- seq(sequence[1],sequence[len],differences[1])
complete_seq_2 <- seq(sequence[1],sequence[len],differences[2])
if(length(complete_seq_1) == 4){
complete_seq <- complete_seq_1
}else{
complete_seq <- complete_seq_2
}
}
complete_seq[!complete_seq %in% sequence]
}
这里有几个示例序列来检查代码是否有效:
find_missing(c(1,3,5,9,11))
find_missing(c(1,5,7))
以下是我尝试过的其他一些事情,而不是排序:
1:
library(pracma)
Mode(diff(sequence))
2:
library(dplyr)
(data.frame(diff_1 = diff(sequence)) %>%
group_by(diff_1) %>%
summarise(count = n()) %>%
ungroup() %>%
filter(count==max(count)))[1]
3:
MaxTable <- function(sequence, mult = FALSE) {
differences <- diff(sequence)
if (!is.factor(differences)) differences <- factor(differences)
A <- tabulate(differences)
if (isTRUE(mult)) {
as.integer(levels(differences)[A == max(A)])
}
else as.integer(levels(differences)[which.max(A)])
}
【问题讨论】: