美文网首页
华为机试 :分配房间问题 输出全排列(无重复)

华为机试 :分配房间问题 输出全排列(无重复)

作者: 房房1524 | 来源:发表于2019-12-17 17:56 被阅读0次

问题描述

  • 输入 m,n (房间数,人数) ,一间房间最多五个人
  • 每间房间人数差不能超过两个
  • 第1行输出未安排房间人数(如果够住输出0)
  • 输出所有可能的组合(1,2 和2,1 不一样)

例子:

输入3,11

输出:
0
3,3,4
4,3,3
3,4,3

业务代码(核心代码在下面)

import java.util.Scanner;

/**
 * @Author fxs
 * @Date 2019/12/15
 **/
public class Main1 {
    static int m, n;

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String a;
        while (in.hasNext()) {
            a = in.nextLine();
            String[] split = a.split(",");
            if (split == null || split.length != 2) {
                System.out.println("invalid");
                return;
            }

            m = Integer.parseInt(split[0]);
            n = Integer.parseInt(split[1]);

            int i = n - 5 * m;
            if (i > 0) {
                System.out.println(i);
                StringBuilder str = new StringBuilder();
                for (int j = 0; j < m; j++) {
                    if (j == m - 1) {
                        str.append("5");
                    } else {
                        str.append("5,");
                    }
                }
                System.out.println(str.toString());
            } else {
                System.out.println(0);
                method(m, n);
            }

        }
    }


    public static void method(int m, int n) {

        float a = ((float) n) / m;
        double floor = Math.floor(a);
        double ceil = Math.ceil(a);
        if (floor == ceil) {
            StringBuilder str = new StringBuilder();
            for (int j = 0; j < m; j++) {
                if (j == m - 1) {
                    str.append(a);
                } else {
                    str.append(String.format("%s,", a));
                }
            }
            System.out.println(str.toString());
        }

        int floorNum = (int) (ceil * m - n);
        int ceilNum = m - floorNum;


        //TODO 输出排列组合内容
        int[] ints = new int[floorNum + ceilNum];
        for (int i = 0; i < floorNum; i++) {
            ints[i] = (int) floor;
        }
        for (int i = floorNum; i < floorNum + ceilNum; i++) {
            ints[i] = (int) ceil;
        }
        getAllPermutation(ints, 0);
    }
}

核心代码

public static void getAllPermutation(int[] a, int index) {
        /* 与a的元素个数相同则输出 */
        if (index == a.length - 1) {
            for (int i = 0; i < a.length; i++) {
                System.out.print(a[i] + " ");//打印数组中所有元素
            }
            System.out.println();
            return;
        }
        //每次打印前先交换一次,如第一次是a[0]与a[0]交换,然后打印出23的组合
        //之后再交换回来,第二次先交换a[0]与a[1],打印之后再还原数组
        for (int i = index; i < a.length; i++) {
            if (isSwap(a, index, i)) {
                swap(a, index, i);
                getAllPermutation(a, index + 1);
                swap(a, index, i);
            }

        }
    }

    static boolean isSwap(int[] str, int start, int end) {
        for (; start < end; start++) {
            if (str[start] == str[end])
                return false;
        }
        return true;
    }

    public static void swap(int[] a, int i, int j) {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }

相关文章

  • 华为机试 :分配房间问题 输出全排列(无重复)

    问题描述 输入 m,n (房间数,人数) ,一间房间最多五个人 每间房间人数差不能超过两个 第1行输出未安排房间人...

  • 子集、全排列、第k个排列

    子集输出 全排列输出 存在重复数字的全排列 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。 按大...

  • Leetcode.46.Permutations

    题目 给定一个没有重复数字的数字序列, 输出这写数字的全排列组合. 思路 这种全排列的问题最直接的思路就是递归. ...

  • 全排列(无重复序列)

    题目:给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例: 这是一个全排列组合的算法!因为题目已经告诉我...

  • 一维数组上的DFS(一):排列问题

    基本问题描述 给定一个可包含重复数字的序列,返回所有不重复的全排列。 Example 输入: [1,1,2]输出:...

  • LeetCode:全排列

    46. 全排列 给定一个** 没有重复** 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:...

  • 全排列算法

    4个数的全排列 结果 任务分配问题

  • 全排列&子集的生成

    全排列 生成 1 ~ n 的全排列 输出: 断点打在这里 index == 0 数字被使用后会被记录,避免了重复以...

  • 每日leetcode 46 2020-04-23

    46. 全排列 给定一个没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3]输出:[[1...

  • 剑指 Offer 第38题:字符串的排列

    1、前言 2、思路 这道题就是全排列,全排列分两种,一种是无重复数字,那么其实不用考虑去重问题,直接把所有结果都放...

网友评论

      本文标题:华为机试 :分配房间问题 输出全排列(无重复)

      本文链接:https://www.haomeiwen.com/subject/fvhenctx.html