(D卷,200分)- 数字排列(Java & JS & Python & C)

题目描述
小明负责公司年会,想出一个趣味游戏:

屏幕给出 1 ~ 9 中任意 4 个不重复的数字,大家以最快时间给出这几个数字可拼成的数字从小到大排列位于第 N 位置的数字,其中 N 为给出数字中最大的(如果不到这么多数字则给出最后一个即可)。

注意:

2 可以当作 5 来使用,5 也可以当作 2 来使用进行数字拼接,且屏幕不能同时给出 2 和 5;
6 可以当作 9 来使用,9 也可以当作 6 来使用进行数字拼接,且屏幕不能同时给出 6 和 9。
如给出:1,4,8,7,则可以拼接的数字为:

1,4,7,8,14,17,18,41,47,48,71,74,78,81,84,87,147,148,178 … (省略后面的数字)

那么第 N (即8)个的数字为 41。

输入描述
输入以逗号分隔的 4 个 int 类型整数的字符串。

输出描述
输出为这几个数字可拼成的数字从小大大排列位于第 N (N为输入数字中最大的数字)位置的数字,

如果输入的数字不在范围内或者有重复,则输出-1。

在这里插入图片描述

题目解析
这个问题要求我们从给定的四个数字中生成所有可能的组合,并按照从小到大的顺序排序,然后返回第 N 个数字(N 是给定数字中的最大值)。需要注意以下几点:

输入的有效性:

输入必须是 1 到 9 之间的四个不重复的整数。
如果输入包含 2 和 5、或 6 和 9,必须只保留其中一个。
数字拼接:

可用数字 2 和 5 互换,6 和 9 互换,因此在拼接时应考虑这些替换。
从给定的数字中生成所有可能的组合和排列。
输出:

若有效,输出第 N 个数字。如果生成的数字少于 N,则输出最后一个数字;如果输入无效,则输出 -1。
java算法源码

import java.util.*;

public class NumberCombination {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        
        // 解析输入
        String[] parts = input.split(",");
        if (parts.length != 4) {
            System.out.println(-1);
            return;
        }

        Set<Integer> uniqueNumbers = new HashSet<>();
        for (String part : parts) {
            try {
                int num = Integer.parseInt(part.trim());
                if (num < 1 || num > 9 || !uniqueNumbers.add(num)) {
                    System.out.println(-1);
                    return;
                }
            } catch (NumberFormatException e) {
                System.out.println(-1);
                return;
            }
        }

        // 检查是否同时存在 2569
        if ((uniqueNumbers.contains(2) && uniqueNumbers.contains(5)) ||
            (uniqueNumbers.contains(6) && uniqueNumbers.contains(9))) {
            System.out.println(-1);
            return;
        }

        // 获取 N 的值
        int N = Collections.max(uniqueNumbers);
        
        // 生成可拼接的数字
        List<Integer> results = new ArrayList<>();
        generateCombinations(new ArrayList<>(uniqueNumbers), "", results);

        // 排序并获取第 N 个元素
        Collections.sort(results);
        if (N > results.size()) {
            System.out.println(results.get(results.size() - 1));
        } else {
            System.out.println(results.get(N - 1));
        }
    }

    private static void generateCombinations(List<Integer> numbers, String current, List<Integer> results) {
        if (!current.isEmpty()) {
            results.add(Integer.parseInt(current));
        }

        for (int i = 0; i < numbers.size(); i++) {
            List<Integer> remaining = new ArrayList<>(numbers);
            remaining.remove(i);
            generateCombinations(remaining, current + numbers.get(i), results);
        }
    }
}

javascript算法源码

function generateCombinations(numbers, current, results) {
    if (current) {
        results.push(parseInt(current));
    }

    for (let i = 0; i < numbers.length; i++) {
        let remaining = numbers.slice();
        remaining.splice(i, 1);
        generateCombinations(remaining, current + numbers[i], results);
    }
}

function getNthNumber(input) {
    let parts = input.split(',').map(part => part.trim());
    if (parts.length !== 4) return -1;

    let uniqueNumbers = new Set();
    for (let part of parts) {
        let num = parseInt(part);
        if (num < 1 || num > 9 || uniqueNumbers.has(num)) return -1;
        uniqueNumbers.add(num);
    }

    if ((uniqueNumbers.has(2) && uniqueNumbers.has(5)) ||
        (uniqueNumbers.has(6) && uniqueNumbers.has(9))) return -1;

    let numbers = Array.from(uniqueNumbers);
    let N = Math.max(...numbers);

    let results = [];
    generateCombinations(numbers, "", results);
    
    results.sort((a, b) => a - b);
    
    if (N > results.length) {
        return results[results.length - 1];
    } else {
        return results[N - 1];
    }
}

// Example usage
let input = "1, 4, 8, 7";
console.log(getNthNumber(input)); // Outputs the result

python算法源码

from itertools import permutations

def generate_combinations(numbers):
    results = set()
    for length in range(1, len(numbers) + 1):
        for combo in permutations(numbers, length):
            results.add(int(''.join(map(str, combo))))
    return sorted(results)

def get_nth_number(input_str):
    parts = [int(x.strip()) for x in input_str.split(',')]
    
    if len(parts) != 4:
        return -1
    
    unique_numbers = set(parts)
    if len(unique_numbers) != 4:
        return -1
    
    if (2 in unique_numbers and 5 in unique_numbers) or (6 in unique_numbers and 9 in unique_numbers):
        return -1

    numbers = list(unique_numbers)
    N = max(numbers)
    
    results = generate_combinations(numbers)
    
    if N > len(results):
        return results[-1]
    else:
        return results[N - 1]

# Example usage
input_str = "1, 4, 8, 7"
print(get_nth_number(input_str))  # Outputs the result

C算法源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_DIGITS 4
#define MAX_RESULTS 10000

void generate_combinations(int *numbers, int size, int *results, int *result_count, int current, int depth) {
    if (depth > 0) {
        results[(*result_count)++] = current;
    }

    for (int i = 0; i < size; i++) {
        int new_depth = depth + 1;
        int new_current = current * 10 + numbers[i];
        generate_combinations(numbers, size, results, result_count, new_current, new_depth);
    }
}

int cmpfunc(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

int get_nth_number(char *input) {
    int numbers[MAX_DIGITS];
    int count = 0;
    int num;
    char *token = strtok(input, ",");
    
    while (token != NULL) {
        if (sscanf(token, "%d", &num) != 1 || num < 1 || num > 9) {
            return -1;
        }
        numbers[count++] = num;
        token = strtok(NULL, ",");
    }
    
    if (count != 4) return -1;

    // Check for duplicate numbers
    for (int i = 0; i < count; i++) {
        for (int j = i + 1; j < count; j++) {
            if (numbers[i] == numbers[j]) return -1;
        }
    }
    
    // Check for forbidden pairs
    int contains2 = 0, contains5 = 0, contains6 = 0, contains9 = 0;
    for (int i = 0; i < count; i++) {
        if (numbers[i] == 2) contains2 = 1;
        if (numbers[i] == 5) contains5 = 1;
        if (numbers[i] == 6) contains6 = 1;
        if (numbers[i] == 9) contains9 = 1;
    }
    if ((contains2 && contains5) || (contains6 && contains9)) return -1;

    int results[MAX_RESULTS];
    int result_count = 0;
    generate_combinations(numbers, count, results, &result_count, 0, 0);

    qsort(results, result_count, sizeof(int), cmpfunc);

    int N = 0;
    for (int i = 0; i < count; i++) {
        if (numbers[i] > N) N = numbers[i];
    }

    if (N > result_count) {
        return results[result_count - 1];
    } else {
        return results[N - 1];
    }
}

// Example usage
int main() {
    char input[] = "1, 4, 8, 7";
    int result = get_nth_number(input);
    printf("%d\n", result);  // Outputs the result
    return 0;
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值