首页 > 其他分享 >数字排列 - 华为OD统一考试(C卷)

数字排列 - 华为OD统一考试(C卷)

时间:2024-03-14 12:58:44浏览次数:13  
标签:end 数字 int OD add collect 华为 mx 考试

OD统一考试(C卷)

分值: 200分

题解: Java / Python / C++

alt

题目描述

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

屏幕给出 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。

示例1

输入:
1,4,8,7

输出:
41

说明:
可以构成的数字按从小到大排序为:
1, 4, 7, 8, 14,17,18,41,47, 48, 71, 74, 78, 81, 84, 87, 147, 148,178...(省略后面的数字)故第 8 个数字为 41。

示例2

输入:
2,5,1,4

输出:
-1

说明:
2 和 5 不能同时出现。

示例3

输入:
3,0,9,1


输出:
-1


说明:
0 不在 1 到 9 的范围内。

示例4

输入:
3,9,7,8

输出:
39


说明:
注意 9 可以当 6 使用,所以可以构成的数字按从小到大排序为:
3, 6, 7, 8, 9, 36, 37, 38, 39, 63, 67, 68, 73, 76, 78, 79, 83 .... (省略后面的数字),故第9个为 39

题解

这道题目是一道组合数字的问题,需要根据给定的数字组合出所有可能的数字,然后进行排序,最后找到第n位的数字。

解题思路如下:

  1. 首先,读取输入的四个数字,构建成一个集合。
  2. 判断集合中是否有非法数字,即数字小于1或大于9的情况,以及是否同时出现了2和5、6和9。
  3. 扩展集合,将2和5等价,将6和9等价。
  4. 根据集合中的数字,生成所有可能的组合数字,包括一位数和两位数。
  5. 将生成的所有数字进行排序。
  6. 返回排序后第n位的数字。

为什么组合数字,只包括一位数和两位数?

  1. n为输入数字中最大的数字, 因此最大值是 9
  2. 输入的数字是 4 个不重复的数字,因此组成的数字个数至少为:
    • 一位数: 至少有 4 个
    • 二位数: 至少有 12 个
  3. 因此, 一位和两位的组合数至少 16 个, 答案拼成的数字从小大大排列位于第 n 个数肯定就包含在里面。

Java

import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
/**
 * @author code5bug
 */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        Set<Integer> s = new HashSet<>();
        String[] inputArr = in.nextLine().split(",");
        for (String str : inputArr) {
            s.add(Integer.parseInt(str.trim()));
        }

        int result = solve(s);
        System.out.println(result);
    }

    public static int solve(Set<Integer> s) {
        int m = Integer.MAX_VALUE, mx = Integer.MIN_VALUE;
        for (int num : s) {
            m = Math.min(m, num); // 获取最小值
            mx = Math.max(mx, num); // 获取最大值
        }

        if (m < 1 || mx > 9) { // 存在非法的数字
            return -1;
        }

        // 不能同时出现
        if ((s.contains(2) && s.contains(5)) || (s.contains(6) && s.contains(9))) {
            return -1;
        }

        int n = mx; // n为输入数字中最大的数字

        // 为了方便组合数字,则需将可以等同的数字也加入进去
        if (s.contains(2) || s.contains(5)) {
            s.add(2);
            s.add(5);
        }
        if (s.contains(6) || s.contains(9)) {
            s.add(6);
            s.add(9);
        }

        // 拼接的数字
        Set<Integer> collect = new HashSet<>(s); // 一位数

        // 二位数的组合
        for (int x : s) {
            for (int y : s) {
                // 每个数字只能使用一次
                if (x != y && x * y != 2 * 5 && x * y != 6 * 9) {
                    collect.add(x * 10 + y);
                }
            }
        }

        // 对组成的数字排序,然后返回第 n 位的数字
        Integer[] sortedArray = collect.toArray(new Integer[0]);
        Arrays.sort(sortedArray);
        return sortedArray[n - 1];
    }
}

Python


def solve(s) -> int:
    m, mx = min(s), max(s)
    if m < 1 or mx > 9:  # 存在非法的数字
        return -1

    # 不能同时出现
    if (2 in s and 5 in s) or (6 in s and 9 in s):
        return -1

    # n为输入数字中最大的数字
    n = mx

    # 为了方便组合数字,则需将可以等同的数字也加入进去
    if (2 in s or 5 in s):
        s.add(2)
        s.add(5)
    if (6 in s or 9 in s):
        s.add(6)
        s.add(9)

    # 拼接的数字
    collect = set(s)  # 一位数

    # 二位数的组合
    for x in s:
        for y in s:
            # 每个数字只能使用一次
            if x != y and x * y != 2 * 5 and x * y != 6 * 9:
                collect.add(x * 10 + y)

    # 对组成的数字排序,然后返回第 n 位的数字
    sorted_array = sorted(list(collect))
    return sorted_array[n - 1]


if __name__ == "__main__":
    arr = set(map(int, input().split(",")))
    print(solve(arr))

C++

#include <bits/stdc++.h>
using namespace std;

using namespace std;

int solve(set<int>& s)
{

    int m = *s.begin(), mx = *(--s.end());
    if (m < 1 || mx > 9) {   // 存在非法的数字
        return -1;
    }

    // 不能同时出现
    if ((s.find(2) != s.end() && s.find(5) != s.end()) || (s.find(6) != s.end() && s.find(9) != s.end())) {
        return -1;
    }

    int n = mx;   // n为输入数字中最大的数字

    // 为了方便组合数字,则需将可以等同的数字也加入进去
    if (s.find(2) != s.end() || s.find(5) != s.end()) {
        s.insert(2);
        s.insert(5);
    }
    if (s.find(6) != s.end() || s.find(9) != s.end()) {
        s.insert(6);
        s.insert(9);
    }

    // 拼接的数字
    set<int> collect(s);   // 一位数

    // 二位数的组合
    for (auto x : s) {
        for (auto y : s) {
            // 每个数字只能使用一次
            if (x != y && x * y != 2 * 5 && x * y != 6 * 9) {
                collect.insert(x * 10 + y);
            }
        }
    }

    // 对组成的数字排序,然后返回第 n 位的数字
    vector<int> sorted_array(collect.begin(), collect.end());
    sort(sorted_array.begin(), sorted_array.end());
    return sorted_array[n - 1];
}

int main()
{
    set<int> s;
    for (int i = 0, x; i < 4; i++) {
        cin >> x;
        s.insert(x);
        if (cin.peek() == ',') cin.ignore();
    }
    cout << solve(s) << endl;
    return 0;
}
    

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

标签:end,数字,int,OD,add,collect,华为,mx,考试
From: https://blog.csdn.net/user_longling/article/details/136707158

相关文章

  • 素数之积 - 华为OD统一考试(C卷)
    OD统一考试(C卷)分值:100分题解:Java/Python/C++题目描述RSA加密算法只在网络安全世界中无处不在,它利用了极大整数因数分解的困难度,数据越大,安全系数越高,给定一个32位正整,请对其进行因数分解,找出是哪两个素数的乘积。输入描述一个正整数num(......
  • 华为OD技术C卷“测试用例执行计划”Java解答
    描述示例算法思路1整体思路是,先读取特性的优先级和测试用例覆盖的特性列表,然后计算每个测试用例的优先级,并将其与测试用例的索引存储到二维数组中。最后按照优先级和索引排序,输出测试用例的索引,即为执行顺序。 首先从标准输入中读取了两个整数n和m,分别表示特性的数......
  • Node.js毕业设计办公用品管理系统(Express)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着信息技术的飞速发展,企业对于办公效率和资源管理的要求越来越高。传统的办公用品管理方式主要依赖人工记录和统计,这种方式不仅效率低下,而且容易出现错误......
  • Node.js毕业设计办公用品管理系统(Express)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:在现代办公环境中,办公用品的管理是一个不可忽视的环节。传统的管理方式通常依赖于人工记录和统计,不仅效率低下,而且容易出错。随着信息技术的发展,越来越多的......
  • 关于java.net.URLEncoder.encode()将空格转成+问题
    1.情景展示如上图所示,当我们使用jdk自带的类对数据进行URL编码时,空格会被转成+。这其实是不对的,我们知道:空格对应url编码是:%20,所以,jdk自带的URLEncoder将空格转成+是不对的。如何解决?2.解决方案既然jdk自带的URLEncoder有问题,我们就有两种解决办法。一种是仍然使用它,然......
  • 2024-03-07-Nodejs(1-Node基础)
    1.初识Nodejs1.1思考为什么js可以在浏览器中被执行?浏览器中具备js解析引擎,其中chrome浏览器的v8引擎最优。为什么js可以操作DOM和BOM?每个浏览器都内置了DOM和BOM这样的api函数,因此浏览器中的js才可以调用它们。js运行环境运行环境是指代码正常运行所必须的环境。......
  • 2024-03-11-Nodejs(3-数据库与身份验证)
    3.数据库与身份验证3.1数据库基本概念数据库是用来组织、存储和管理数据的仓库;传统数据库中,数据结构分为数据库(database)、数据表(table)、数据行(tow)、字段(field)四大部分。3.2配置mysql模块安装mysql模块npminstallmysql建立连接constmysql=require('mysql')......
  • 2024-03-08-Nodejs(2-Express)
    2.Express​ 基于Node.js平台,快速、开放、极简的Web开发框架,Express是用于快速创建服务器的第三方模块。2.1基本使用#安装expressnpminstallexpressconstexpress=require("express");//创建web服务器constapp=express();//监听客户端的GET和POST......
  • 2024-03-11-Nodejs(4-大事件项目)
    4.大事件项目4.1项目初始化项目整体架构图大事件项目 |--- db | |---index.js |---router | |---user.js |---router_handler | |---user.js |---schema | |---user.js |---app.js |---config.js4.1.1创建项目新建api_server文件夹作为项目......
  • vscode常用快捷键
    一、vscode的常用快捷键1、注释:a)单行注释:[ctrl+k,ctrl+c]或ctrl+/b)取消单行注释:[ctrl+k,ctrl+u](按下ctrl不放,再按k+u)c)多行注释:[alt+shift+A]d)多行注释:/**2、移动行:alt+up/down3、显示/隐藏左侧目录栏 ctrl+b4、复制当前行:shift+alt......