首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >PHP中包含重复字符的数字排列

PHP中包含重复字符的数字排列
EN

Stack Overflow用户
提问于 2016-02-24 08:07:10
回答 2查看 355关注 0票数 2

我将一个数字存储在一个字符串中。我的代码将数字打乱成不同的排列。

例如,输入为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'123'

那么输出排列将是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
123,132,213,231,321,312

如果输入的字符串有重复的数字,我的代码就无法工作,并进入无限循环。

不起作用的示例输入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
11,22,33,44,55,455,998,855,111,555,888,222 etc.

我的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
function factorial($n){
    if($n==1) return $n;

    return $n*factorial($n-1);
}

$a   = '1234';
$_a  = str_split($a);
$num = count($_a);
$ele_amnt = factorial($num);
$output = array();
while(count($output) < $ele_amnt){
    shuffle($_a);
    $justnumber = implode('', $_a);
    if(!in_array($justnumber , $output))
        $output[] = $justnumber;

}
sort($output);
print_r($output);

有人能解释一下为什么和如何修复它吗?

EN

回答 2

Stack Overflow用户

发布于 2016-02-24 08:35:02

简而言之: while循环的终止条件“是”permutational,而if(!in_array...)测试“是”combinational“。

假设$a=11;:那么$ele_amnt2,并且当数组$output包含多个元素时,while循环将停止。

随机/内爆代码可以生成字符串<firstelement><seconelement><secondelement><firstelement>,这两个字符串都是11

并且if(!in_array( $justnumber , $output))只允许将其中一个附加到$output。因此count($output)在第一次迭代后将为1,并且将永久保持为1。对于每个具有重复数字的$a都是如此。

shuffle()会随机更改数组中元素的位置。因此,算法的性能取决于....luck ;-)您可能会对https://pear.php.net/package/Math_Combinatorics之类的东西感兴趣。

票数 2
EN

Stack Overflow用户

发布于 2016-02-24 11:10:13

如果您的输入中有重复的字符,则您的输出数组将包含较少的排列。所以你的循环永远不会完成。

您可以映射您的输入,然后从您的输出映射回来,然后根据您的需要进行过滤:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// For a string '122' we get the permutations of '123' first and then process.

$output = op_code_no_repeats('123');

$filtered = array();
foreach($output as $permutation) {
    $filtered[] = str_replace('3', '2', $permutation);
}
$filtered = array_unique($filtered);

var_dump($filtered);

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array (size=3)
  0 => string '122' (length=3)
  2 => string '212' (length=3)
  3 => string '221' (length=3)

你的代码在阶乘和置换函数上有保护:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function factorial($n)
{
    if(! is_int($n) || $n < 1)
        throw new Exception('Input must be a positive integer.');
    if($n==1)
        return $n;

    return $n * factorial($n-1);
};

function op_code_no_repeats($a) {

    $_a  = str_split($a);

    if(array_unique($_a) !== $_a)
        throw new Exception('Does not work for strings with repeated characters.');

    $num = count($_a);
    $perms_count = factorial($num);

    $output = array();
    while(count($output) < $perms_count){
        shuffle($_a);
        $justnumber = implode('', $_a);
        if(!in_array($justnumber , $output))
            $output[] = $justnumber;
    }
    sort($output);

    return $output;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35596513

复制
相关文章
【说站】php包含字符
strpos函数返回boolean值。strpos的执行速度比其他函数快。另外,strpos有参数指定的判断位置,但默认为空。意思是判断整个字符串。缺点是对中文的支持不好。
很酷的站长
2022/11/23
1.5K0
【说站】php包含字符
打印不重复的字符串全排列(递归)
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 
砖业洋__
2023/05/06
3970
打印不重复的字符串全排列(递归)
[剑指offer] 数组中重复的数字
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
尾尾部落
2018/09/04
2.1K0
数组中重复的数字
在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
MickyInvQ
2021/10/22
2.3K0
求字符串内不包含重复字符的最长子串
        一个字符串,求这个字符串中不包含重复字符的最长子串的长度,如abba返回2,aaaaabc返回3,bbbbbbb返回1,等等上面是测试用例。那么我解决这个问题的思路有两种:
actionzhang
2022/11/30
1.1K0
[PHP] 算法-字符串的全排列的PHP实现
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 思路: 1.利用递归形
唯一Chat
2019/09/10
5410
[PHP] 算法-字符串的全排列的PHP实现
注意!PHP中字符串与数字的比较
在日常开发过程中,==运算符是我们每天都会接触到的。这个运算符中其实埋了非常多的坑,今天我们就来看下字符串和数字用==比较需要注意的问题。
硬核项目经理
2019/12/04
2.1K0
数字排列
输入M、N,显示数字排列,如输入4、6: 1   3   6  10  14  18 2   5   9  13  17  21 4   8  12  16  20  23
lop
2019/03/13
5980
数组中的重复数字
"""描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1数据范围:0\le n \le 10000 \0≤n≤10000进阶:时间复杂度O(n)\O(n) ,空间复杂度O(n)\O(n)示例1输入:[2,3,1,0,2,5,3]复制返回值:2复制说明:2或3都是对的数据范围
用户9955628
2022/08/22
1.4K0
查找数组中重复的数字
        题目来源于《剑指Offer》中的面试题3:找出数组中重复的数字。   // 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,   // 也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},   // 那么对应的输出是重复的数字2或者3。         解决方法有多种,包括数组排序,哈希表法,以及作者推荐的重排数组法。此处介绍自己的一个做法,以空间换
waylon
2018/03/08
4K0
数字排列
对于相同数,我们人为定序,就可以避免重复计算:我们在dfs时记录一个额外的状态,记录上一个相同数存放的位置 start,我们在枚举当前数时,只枚举
派大星在吗
2021/12/17
6290
字符的全排列
昨天又同学要去面试问到我关于字符全排列的问题,网上有现成的答案,但是看懂还是挺费劲的。
卡尔曼和玻尔兹曼谁曼
2019/01/25
4780
字符串中字符出现重复字符
下面是总结的一些常见问题,以供大家参考 第一次出现重复字符 出现的重复字符 出现字符串、字符还有次数 出现次数最多的字符及次数 class Eclass{ public static void main(String[] args) { String str = "eeeejwurihewweafa"; Eclass e = new Eclass(); //问题一 int index = e.Method(str); S
崔笑颜
2020/06/08
1.7K0
Java 实现判断字符串是否包含字母,是否包含数字
目录 1 实现 1 实现 /** * 判断是否是数字 * @param * @return */ public static boolean
一写代码就开心
2023/02/27
2.8K0
去除字符串中重复字符
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/147190.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/01
1.7K0
去除字符串中重复字符
php将字符串进行ASCII升序排列[通俗易懂]
注意:如果是中文,php文件环境是UTF-8,GBK不需要mb_convert_encoding操作
全栈程序员站长
2022/08/09
1.1K0
[PHP] 算法-数组重复数字统计的PHP实现
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。 1.哈希法 2.定义备用数组,作为哈希使用,key是原数组每个元素 value是出现的次数 3.遍历哈希数组 hash for i=0i;<arr.length;i++ hash[arr[i]]++; foreach hash as
唯一Chat
2019/09/10
1.2K0
寻找数组中的重复数字
前面一系列文章分享了数据结构与算法的基础知识,接下来分享一些算法题的解题思路与实现。欢迎各位感兴趣开发者阅读。
神奇的程序员
2022/04/10
1.4K0
寻找数组中的重复数字
数组中的重复数字_50
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 由上句话我们可以利用两个信息 1 .我们用数字的值作为数组的位置,然后数组里面就存放数字的大小。 2 .int值默认是0
名字是乱打的
2021/12/23
1K0
数组中的重复数字_50
字符串的排列(全排列问题)
输入一个字符串,按字典序打印出该字符串中字符的所有排列。 例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
名字是乱打的
2022/05/13
5030
字符串的排列(全排列问题)

相似问题

python中重复字符的排列

246

Python迭代工具排列--如何包含重复字符

24

用不同的数字排列重复值

25

按python中数字部分的升序排列包含数字和字母的字符串列

12

php在字符串中包含数字

241
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文