阿里面试 8-28 全排列去重问题

阿里面试 8-28 全排列去重问题

先看 剑指offer 全排列去重问题的问题

27 字符串的排列

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

DFS进行递归+回溯法解

import java.util.*;
public class Solution {
    StringBuffer strbuffer=new StringBuffer();
    TreeSet<String> treeSet=new TreeSet<String>();
    boolean[] visit;//回溯标记,判断是否访问过
    public ArrayList<String> Permutation(String str) {
        ArrayList<String> arraylist=new ArrayList<String>();
        if(str.equals("")||str==null) return arraylist;
        //排序 按照字母排序
        char[] strs=str.toCharArray();
        Arrays.sort(strs);
        visit=new boolean[str.length()];
        dfs(strs,strs.length);//深度优先遍历
        arraylist.addAll(treeSet);
        return arraylist;
    }
    public  void dfs(char[] chars,int len){
        if(strbuffer.length()==len){
            treeSet.add(strbuffer.toString());
            return;
        }
        for(int i=0;i<chars.length;i++){
            if(visit[i]==false){
                visit[i]=true;
                strbuffer.append(chars[i]);
                dfs(chars,len);
                visit[i]=false;
                strbuffer.deleteCharAt(strbuffer.length()-1);
            }
        }
    }
}

数字的全排列

输入两个数 322 2
第一个数代表需要全排列的数字322,去掉全排列后以0开头的数字,并输出有几个数可以把2整除
输出 2
在这里插入图片描述

一、String转为int
int i=Integer.parseInt(string);
int i=Integer.valueOf(s);

二、int转为String
String s = String.valueOf(i);
String s = Integer.toString(i);
String s = “”+ i;

import java.util.Iterator;
import java.util.Scanner;
import java.util.TreeSet;

public class Main {
    static StringBuffer strbuffer=new StringBuffer();
    static TreeSet<String> treeSet=new TreeSet<String>();
    static boolean[] visit;//回溯标记,判断是否访问过

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);//输入
        int n=sc.nextInt();//获取第一个数
        int m=sc.nextInt();//获取第二个数
        String str=n+"";//数字转成字符串
        if(str==null||str.equals("")) return;
        visit=new boolean[str.length()];
        dfs(str,str.length());//深度优先遍历
        Iterator<String> it=treeSet.iterator();//迭代器
        int count=0;//计数
        while(it.hasNext()){
            String s=it.next();
            if(s.charAt(0)!='0'){ //去掉0开头的
                int num=Integer.valueOf(s);
                if(num%m==0){  //是否整除m
                    count++;
                }
            }
        }
        System.out.println(count);
    }
    public static void dfs(String str,int len){
        if(strbuffer.length()==len){//递归终止条件
            treeSet.add(strbuffer.toString());//加入treeset
            return;
        }
        for(int i=0;i<str.length();i++){
            if(visit[i]==false){//判断是否访问
                visit[i]=true;//设置已访问
                strbuffer.append(str.charAt(i));//加入到字符串中
                dfs(str,len);//继续递归
                visit[i]=false;//回溯 释放已访问,表示没有访问
                strbuffer.deleteCharAt(strbuffer.length()-1);//移除刚刚的加入的字符
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值