笔试中遇到了3次这道题,题目大致是这样的:请编写代码实现有重复元素的全排列问题 。
整理了下思路,写了个java代码, 这个代码既可以针对有重复元素的全排列,又可以针对无重复元素的全排列
public class repeatAllArray {
/*
* allArray实现含有重复字符的数组的全排列
* list是含重复字符的数组,i是指示当前位置的游标,length是数组长度
* 注释:这个函数最核心的地方,我感觉是else块的代码
*/
public void allArray(char list[], int i, int length) {
if (i == length - 1) {
for (int j = 0; j < length; j++) {
System.out.print(list[j]);
}
System.out.println();
} else {
for (int j = i; j < length; j++) {
if (!isExist(list, i, j)) {
swap(list, i, j);// 交换当前值和当前位置之后的值
allArray(list, i + 1, length);// 当前位置+1,递归
swap(list, i, j);// 再交换
}
}
}
}
/*
* isExist判断j位置的字符是否已经在list[0]~list[j-1]中出现过了
* list是含重复字符的数组,i是指示当前位置的游标,j是要判断的字符的位置
*/
public boolean isExist(char list[], int i, int j) {
for (int k = i; k < j; k++) {
if (list[j] == list[k]) {
return true;
}
}
return false;
}
/*
* swap实现了数组中两个位置的值的交换
* list是含重复字符的数组,i,j表示要交换的位置
*/
public void swap(char list[], int i, int j) {
char temp = list[i];
list[i] = list[j];
list[j] = temp;
}
public static void main(String[] args) {
char a[] = { 'a', 'a', 'b', 'b' };//以这个字符数组为例
repeatAllArray array = new repeatAllArray();
array.allArray(a, 0, a.length);
}
}
分享到:
相关推荐
全排列是指从给定的字符数组中,按照一定的顺序生成所有可能的排列组合。这个问题通常使用回溯法来解决,因为它能够有效地避免重复的排列。下面我们将深入探讨如何使用Java实现字符数组的全排列。 首先,我们需要...
这种算法常用于密码学、数据加密以及计算机科学中的各种组合优化问题,例如在处理含有重复字母的字符串时,找出所有可能的重组方式。 #### 知识点二:算法实现原理 在Java中实现重复元素全排列,通常采用递归的...
在C#编程中,求解数组元素全排列是一项常见的任务,尤其在算法设计和数据处理领域。全排列是指从n个不同元素中取出m个元素,按照一定的顺序排成一列的所有可能组合,其中m≤n。在这个问题中,我们讨论的是如何在C#中...
树 * 字典树 * 遍历-层次遍历 * 遍历-中序遍历-非递归 * 遍历-前序遍历-非递归 * 遍历-后序遍历-非递归 * 二叉查找树-两数之和 ...数组&字符串 查找排序 排列组合 动态规划 树 链表 数学 位运算 编程之美
然后将输入的字符串转换为整数列表,并调用`perm`函数输出所有全排列。 在实际应用中,全排列问题可以用于各种场景,例如生成所有可能的密码组合、解决组合优化问题或在组合数学中分析可能的事件序列。了解如何有效...
在这个问题中,我们有一个名为$source的数组,包含字符串元素'pll'、'我'、'爱'、'你'和'嘿'。我们的目标是生成并打印出这个数组的所有可能排列。 在PHP中,可以使用回溯法(Backtracking)或基于比较的排序算法来...
在Golang中实现全排列算法主要是为了解决排列组合问题,特别是在处理字符串或数组时,例如在上述例子中,需要对一组数字进行字典序排序并输出所有可能的排列。全排列算法是找出一个序列中所有可能的排列方式,且每个...
数组全排列是指将数组中的元素按不同顺序重新组合,形成所有可能的排列方式。而元素所有组合则是指从数组中取出任意数量的元素,形成所有可能的组合。本知识点将详细介绍如何用PHP实现这两个功能,同时涵盖数组的...
如果输入123,那么就会输出123,132,213,231,312,321,依次列推
在编写JavaScript代码时,实现字符的全排列是一个常见的算法问题,它涉及到组合数学中的排列组合知识。所谓全排列,是指将一个字符串中的所有字符进行重排,得到所有可能的排列组合。在给定的文件内容中,提供了一个...
只用了一维长度为9的数组 全排列问题可以看做简化规则的八皇后问题噢!!
在swap方法中,我们使用了字符数组的交换操作,来交换两个字符的位置。 java实现字符串的全排列可以使用递归思想和TreeSet来实现。通过将需要全排列的字符串分为两部分,并对第一个字符和后面的字符进行交换,可以...
关于代码的运行过程,首先是初始化一个空的结果数组`$res`,然后调用`test`函数,从字符串的首字符开始全排列。在每一步递归中,会打印出当前字符串和起始位置,以帮助理解递归树的生成过程。递归树是深度优先搜索树...
在某些编程语言中,字符串可能以字符数组的形式存储,而在另一些语言中则可能是一个内置的数据类型。此外,对字符串的遍历、比较以及修改操作等都可能影响算法的实现和效率。 总的来说,字符串处理是计算机编程中的...
- `TestPermute.java`:可能实现了字符串的全排列算法,并命名为`permute`方法。 - `Test2.java`:可能是对另一种算法的实现,比如改进或优化过的版本。 - `Test.java`:通常用于编写单元测试,检验各种输入情况下,...
"Java递归实现字符串全排列与全组合" Java递归实现字符串全排列与全组合是指使用Java语言通过递归算法实现字符串的全排列和全组合。全排列是指将字符串中的所有元素按照一定的顺序进行排列,而全组合是指将字符串...
然后,对每一个首位字符的排列,再选择下一个字符,重复这个过程,直到所有字符都被选择过。 以下是一个简单的递归函数实现全排列的逻辑: 1. 如果已经到达字符串的末尾(position == end),说明当前的排列是一个...
在C++代码中,可能会定义一个函数如`permute(char* str, int start, int end)`,其中`str`是原始字符数组,`start`是当前处理的位置,`end`是字符数组的结束位置。递归函数内部将遍历从`start`到`end`的所有字符,...
这种排列通常涉及到计算机科学中的全排列算法,尤其是在处理字符串或数组时。 标签 "permutation" 指出该主题的核心是全排列。全排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列的所有可能的...