zoukankan      html  css  js  c++  java
  • 数字全排列问题

    问题: 数字或字母的全排列,如123,全排列结果共 123,132,231,213,312,321 六种;

    实现代码:

    import java.util.ArrayList;
    
    /**
     * 数字或字母的全排列,如123,全排列结果共 123,132,231,213,312,321 六种;
     * 
     */
    public class Test4 {
    	static ArrayList<String> list = new ArrayList<String>();
    
    	public static void main(String[] args) {
    		char buf[] = { '1', '2', '3', '4' };
    		sort(buf, 0, buf.length - 1);
    		System.out.println(list.toString());
    	}
    
    	public static void sort(char[] data, int start, int end) {
    		// 递归的结束条件
    		if (start == end) {
    			list.add(new String(data));
    		} else {
    			for (int i = start; i <= end; i++) {
    				//处理数组中相同的元素
    				if (data[i] == data[start] && i != start) {
    					continue;
    				} else {
    					// 交换数组第一个元素与后续的元素
    					swap(data, i, start);
    
    					// 后续元素递归全排列
    					sort(data, start + 1, end); 
    
    					// 将交换后的数组还原
    					swap(data, i, start);
    				}
    			}
    		}
    	}
    
    	// 交换数组中不同位置的值
    	public static void swap(char[] data, int i, int j) {
    		char temp = data[i];
    		data[i] = data[j];
    		data[j] = temp;
    	}
    }
    
    实现思路如下:

    首先能想到的便是递归的方式,但递归的思路有好多种,这只是其中一种。

    这种思路是:分别计算第i个数据排在第一位的时候,其他n-1个数据的全排列,而n-1的全排列和n的全排列又是完全一样的,一直到只有一个数据时,也就是递归的结束条件。

    如数字1234全排列,首先将1固定,对234进行全排列,而对234排列,将2固定,对34进行全排列,依次进行。

    如果不考虑重复,还有一些不错的递归实现方式(以下均是转载):

    转载自CSDN,作者 preferme (冰思雨) ,具体地址忘记了:

    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 转载自CSDN,作者是 冰思雨
     * @author preferme
     *
     */
    public class Test1 {
    
    	public static void main(String[] args) {
    		String s = "1245";
    		List<String> result = new ArrayList<String>();
    		list(s, "", result);
    		System.out.println(result.size());
    		System.out.println(result);
    	}
    
    	/**
    	 * 列出基础字符串(base)的所有组合
    	 * 
    	 * @param base
    	 *            以该字符串作为基础字符串,进行选择性组合。
    	 * @param buff
    	 *            所求字符串的临时结果
    	 * @param result
    	 *            存放所求结果
    	 */
    	public static void list(String base, String buff, List<String> result) {
    		if (base.length() <= 0) {
    			result.add(buff);
    		}
    		for (int i = 0; i < base.length(); i++) {
    			list(new StringBuilder(base).deleteCharAt(i).toString(), buff
    					+ base.charAt(i), result);
    		}
    	}
    }
    

    另一种方式累死(忘记转载自哪里了):

    public static void main(String[] args) {
    		String[] datas = new String[] { "1", "2", "3","4" };
    		sort(Arrays.asList(datas), new ArrayList<String>());
    	}
    	
    	private static void sort(List<String> datas, List<String> target) {
            if (target.size() == 4) { // 这个4表示要对几个字符进行全排列
                for (Object obj : target)
                    System.out.print(obj);
                System.out.println();
                return;
            }
            for (int i = 0; i < datas.size(); i++) {
                List<String> newDatas = new ArrayList<String>(datas);
                List<String> newTarget = new ArrayList<String>(target);
                newTarget.add(newDatas.get(i));
                newDatas.remove(i);
                sort(newDatas, newTarget);
            }
        }


  • 相关阅读:
    JS---案例:tab切换效果
    .net core 使用MD5加密解密字符串
    c#实战开发:用.net core开发一个简单的Web以太坊钱包 (六)
    c#实战开发:以太坊Geth 命令发布智能合约 (五)
    c#实战开发:以太坊Geth 常用命令 (四)
    c#实战开发:以太坊钱包快速同步区块和钱包卡死解决方案 (三)
    c#实战开发:以太坊钱包对接私链 (二)
    c# API接受图片文件以文件格式上传图片
    c# API接受图片文件以Base64格式上传图片
    命令查看当前电脑安装所有版本.NET Core SKD
  • 原文地址:https://www.cnblogs.com/xiaozhang2014/p/5297278.html
Copyright © 2011-2022 走看看