逆FizzBuzz问题求最短序列
问题描述
FizzBuzz问题:一个大于0的自然数能整除3,将输出“Fizz”;能整除5,将输出“Buzz”;能整除3和5,将输出“FizzBuzz”;否则输出自己。
逆FizzBuzz问题最短序列:已知一个FizzBuzz问题的非数字输出序列,求能获得该序列的最短连续数字序列。如“Fizz”的最短序列是“3”,“Fizz Buzz”的最短序列是“9 10”,而不是“3 4 5”。
编程实现
<?php /**
* @author cenze
*
* 反FizzBuzz问题求最短序列
*
* $inverseFizzBuzz = new InverseFizzBuzz([
* 'fizz',
* 'fizz',
* 'buzz',
* ]);
* $inverseFizzBuzz->sequence():
* Array ( [0] => 6 [1] => 7 [2] => 8 [3] => 9 [4] => 10 )
*/
class InverseFizzBuzz
{
// FizzBuzz问题赋值
const FizzBuzz = [
'fizz' => 3,
'buzz' => 5,
'fizzbuzz' => 15
]; // 预定义问题区间
private $range = [
1,
100
]; // 待求序列
private $list = []; // 待求序列包含项数统计
private $listItemsCount = 0; public function __construct($list = [], $range = [])
{
$this->init($list, $range);
} /**
* 待求序列、区间初始化
*
* @param array $list
* 待求序列
* @param array $range
* 问题区间
* @param bool $check
* 是否检查属性已完成初始化
*
* @return void
*/
private function init($list = [], $range = [], $check = false)
{
if ($list) {
$this->list = $this->inverseList($list);
$this->listItemsCount = count($this->list);
if (! $this->listItemsCount) {
exit('Invalid list.');
}
} if ($range) {
$this->range = $range;
} if ($check) {
if (! $this->list) {
exit('Property list uninitialized.');
}
}
} /**
* 将待求解序列反转
*
* @param array $list
* 待求解序列
*
* @return mixed
*/
private function inverseList($list)
{
$inverseList = [];
foreach ($list as $item) {
if (! array_key_exists($item, self::FizzBuzz)) {
return null;
}
$inverseList[] = self::FizzBuzz[
$item
];
} return $inverseList;
} /**
* 搜索最短序列是否存在
*
* @param array $list
* 待求序列
* @param array $range
* 问题区间
*
*
* @return mixed
*/
public function sequence($list = [], $range = [])
{
$this->init($list, $range, true); $sequences = $this->findSequences();
if (! $sequences) {
return 'Found no sequences.';
} $sequence = $this->findShortestSequence($sequences);
// 将最短序列序列化后返回
return range($sequence[0], $sequence[$this->listItemsCount - 1]);
} /**
* 搜索最短序列(未序列化)
*
* @param array $sequences
* 序列集合,包含最短序列
*
* @return array
*/
private function findShortestSequence($sequences)
{
// 默认第一条为最短
$shortestSequence = $sequences[0];
// 把每一个序列看做一条路径,都有对应的长度。记录最短的序列长度
$shortestSequenceLength = $sequences[0][$this->listItemsCount - 1] - $sequences[0][0];
// 为array_reduce()定义一个callback,用来搜索最短序列
$findShortestSequence = function ($shortestSequence, $currentSequence) use(&$shortestSequenceLength) {
$currentSequenceLength = $currentSequence[$this->listItemsCount - 1] - $currentSequence[0];
if ($currentSequenceLength < $shortestSequenceLength) {
$shortestSequenceLength = $currentSequenceLength;
return $currentSequence;
} else {
return $shortestSequence;
}
}; return array_reduce($sequences, $findShortestSequence, $shortestSequence);
} /**
* 从指定位置开始搜索指定项目的序列
*
* @param int $item
* 指定项目
* @param int $start
* 起始搜索位置
*
* @return int
*/
private function findItemSequenceFromPosition($item, $start)
{
if ($start % $item == 0) {
return $start;
} return $start + ($item - $start % $item);
} /**
* 从指定位置开始搜索首个序列
*
* @param int $start
* 起始搜索位置
*
* @return mixed
*/
private function findSequenceFromPosition($start)
{
$listSequence = [];
for ($i = 0; $i < $this->listItemsCount; $i ++) {
$itemSequence = $this->findItemSequenceFromPosition($this->list[$i], $start);
if ($itemSequence > $this->range[1]) {
return null;
} else {
$listSequence[] = $itemSequence;
$start = $itemSequence + 1;
}
} return $listSequence;
} /**
* 找到多个序列,其中包括最短序列
*
* @return void
*/
private function findSequences()
{
$sequences = [];
// 以第一个项为初始搜索位置在预定区间中搜索,且以第一个项为递增步长向后逐步搜索
for ($start = $this->list[0]; $start <= $this->range[1]; $start += $this->list[0]) {
// 只需找到指定位置开始的第一个序列即可
if ($sequence = $this->findSequenceFromPosition($start)) {
$sequences[] = $sequence;
}
} return $sequences;
}
}
逆FizzBuzz问题求最短序列的更多相关文章
- hdu 1394 zoj 1484 求旋转序列的逆序数(并归排序)
题意:给出一序列,你可以循环移动它(就是把后面的一段移动到前面),问可以移动的并产生的最小逆序数. 求逆序可以用并归排序,复杂度为O(nlogn),但是如果每移动一次就求一次的话肯定会超时,网上题解都 ...
- hdu 1394 Minimum Inversion Number (裸树状数组 求逆序数 && 归并排序求逆序数)
题目链接 题意: 给一个n个数的序列a1, a2, ..., an ,这些数的范围是0-n-1, 可以把前面m个数移动到后面去,形成新序列:a1, a2, ..., an-1, an (where m ...
- 动态规划求一个序列的最长回文子序列(Longest Palindromic Substring )
1.问题描述 给定一个字符串(序列),求该序列的最长的回文子序列. 2.分析 需要理解的几个概念: ---回文 ---子序列 ---子串 http://www.cnblogs.com/LCCRNblo ...
- [zz]求一维序列的信息熵(香浓熵)的matlab程序实例
对于一个二维信号,比如灰度图像,灰度值的范围是0-255,因此只要根据像素灰度值(0-255)出现的概率,就可以计算出信息熵. 但是,对于一个一维信号,比如说心电信号,数据值的范围并不是确定的, ...
- poj 2001:Shortest Prefixes(字典树,经典题,求最短唯一前缀)
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 12731 Accepted: 544 ...
- 39. 求分数序列前N项和
求分数序列前N项和 #include <stdio.h> int main() { int i, n; double numerator, denominator, item, sum, ...
- 20. 求阶乘序列前N项和
求阶乘序列前N项和 #include <stdio.h> double fact(int n); int main() { int i, n; double item, sum; whil ...
- 19. 求平方根序列前N项和
求平方根序列前N项和 #include <stdio.h> #include <math.h> int main() { int i, n; double item, sum; ...
- OpenJudge计算概论-求分数序列和
/*======================================================================== 求分数序列和 总时间限制: 1000ms 内存限制 ...
随机推荐
- XSS攻击之窃取Cookie
10 年前的博客似乎有点老了,但是XSS 攻击的威胁依然还在,我们不得不防. 窃取Cookie是非常简单的,因此不要轻易相信客户端所声明的身份.即便这个Cookie是在数秒之前验证过,那也未必是真的, ...
- java 设计模式 ---- 单例模式
只产生一个实例, 所以要使用静态方法对外暴露对象(如果使用反射技术, 也能调用私有的构造方法) 懒汉模式 并发时还是可能会产生多个实例, 所以同步处理 public class User{ priva ...
- 数据结构学习java(一点五)链式顺序表(链表)
java中没有将指针暴露给用户(以前做过看过一篇文章写有java中是有指针的,只是被藏起来了),所以得使用引用的方式. 何为引用请看下面这篇文章(写的很不错,当然肯定比我写的好): https://w ...
- 测者的测试技术手册:Java中的null类型是测试不可超越的鸿沟
null是一个非常非常特殊的类型,对于每一个测试人员都要十分小心null的存在的可能性.同时null也让很多RD头疼,甚至连Java的设计者都成人null是一个设计失误.这篇文章,测者想聊聊这个让很多 ...
- 11 Django REST Framework 针对基于类的视图添加 @csrf_exempt
01-在类的 dispatch 方法上使用 @csrf_exempt from django.views.decorators.csrf import csrf_exempt class MyView ...
- 类 Calendar
简介 Java.util.Calendar是日历类,在Date后出现,替换掉了许多Date的方法.该类将所有可能用到的时间信息封装为静态成员变量,方便获取.日历类就是方便获取各个时间属性的.注意Cal ...
- selenium中隐式等待和显示等待的区别
Selenium显示等待和隐式等待的区别1.selenium的显示等待原理:显示等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么久 ...
- C#技巧记录——持续更新
作为一名非主修C#的程序员,在此记录下学习与工作中C#的有用内容,持续更新 对类型进行约束,class指定了类型必须是引用类型,new()指定了类型必须具有一个无参的构造函数 where T : cl ...
- Hbuilder工具使用
现在用的版本是:HBuilder 9.1.19.201808300739 前段时间自动更新了下,也忘记了是更新后js代码不能正常代码提示,还是又发生了什么事情,导致了不能正常提示,也没时间去排查,卸载 ...
- [转帖]Qemu 简述
Qemu 简述 记得KVM 就是 底层用的qemu https://www.cnblogs.com/bakari/p/7858029.html 本文首发于我的公众号 Linux云计算网络(id: cl ...