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

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;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;
}

‍❤️‍有考友通过专栏已经快速通过机考,都是原题哦~~ 💪

📝 订阅 http://t.csdnimg.cn/lifXk

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/539107.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Jenkins 管道在 Docker Hub 中构建 Docker 镜像

Jenkins Pipeline 是一个强大的工具&#xff0c;可以自动执行部署。在各个阶段之间拆分的灵活和自定义操作是尝试此功能的一个很好的理由。 构建您自己的 Docker 镜像并将其上传到 Docker Hub 以保持存储库更新是了解 Jenkins Pipeline 如何改进您的工作方式的一个很好的示例。…

Exam in MAC [容斥]

题意 思路 正难则反 反过来需要考虑的是&#xff1a; (1) 所有满条件一的(x,y)有多少对&#xff1a; x 0 时&#xff0c;有c1对 x 1 时&#xff0c;有c对 ...... x c 时&#xff0c;有1对 以此类推 一共有 (c2)(c1)/2 对 (2) 符合 x y ∈ S的有多少对&#xff1a…

【django framework】ModelSerializer+GenericAPIView,如何获取HTTP请求头中的信息(远程IP、UA等)

【django framework】ModelSerializerGenericAPIView&#xff0c;如何获取HTTP请求头中的信息(远程IP、UA等) 某些时候&#xff0c;我们不得不获取调用当前接口的客户端IP、UA等信息&#xff0c;如果是第一次用Django Restframework&#xff0c;可能会有点懵逼&#xff0c;那么…

node.js入门—day02

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;给自己一个梦想&#xff0c;给世界一个惊喜。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章目录 什么是单线程…

uniapp微信小程序_拍照从相册选择

userImg() {let that thisuni.chooseMedia({count: 1,mediaType: [image, video],sourceType: [album, camera],maxDuration: 30,camera: back,success(res) {console.log(res.tempFiles[0].tempFilePath)that.imagUrl res.tempFiles[0].tempFilePath}})}, 直接调用api即可,注…

GPT实战系列-如何让LangChain的Agent选择工具

GPT实战系列-如何让LangChain的Agent选择工具 LangChain GPT实战系列-LangChain如何构建基通义千问的多工具链 GPT实战系列-构建多参数的自定义LangChain工具 GPT实战系列-通过Basetool构建自定义LangChain工具方法 GPT实战系列-一种构建LangChain自定义Tool工具的简单方法…

手动创建线程池各个参数的意义?

今天我们学习线程池各个参数的含义&#xff0c;并重点掌握线程池中线程是在什么时机被创建和销毁的。 线程池的参数 首先&#xff0c;我们来看下线程池中各个参数的含义&#xff0c;如表所示线程池主要有 6 个参数&#xff0c;其中第 3 个参数由 keepAliveTime 时间单位组成。…

一、C#冒泡排序算法

一、C#冒泡排序算法 简介 冒泡排序算法是一种基础的排序算法&#xff0c;它的实现原理比较简单。核心思想是通过相邻元素的比较和交换来将最大&#xff08;或最小&#xff09;的元素逐步"冒泡"到数列的末尾。 实现原理 冒泡排序是一种简单的排序算法&#xff0c;其…

《Ubuntu20.04环境下的ROS进阶学习4》

一、发布地图消息 在上一小节中我们已经获取到了激光雷达的数据&#xff0c;在本接中我们将学习地图数据格式和如何发布地图数据。 二、了解地图数据格式 首先登录 index.ros.org 网站搜索一下map_server消息包。您也可以直接搜这个网址 map_server - ROS Wiki &#xff0c;下翻…

matplotlib-直方图

日期&#xff1a;2024.03.114 内容&#xff1a;将matplotlib的常用方法做一个记录&#xff0c;方便后续查找。 # 引入需要的库 from matplotlib import pyplot as plt import numpy as np# 设置画布大小 plt.figure(figsize (20,8),dpi 200)# 全局设置中文字体 plt.rcParams…

独立开发的轻量级简洁开源论坛BBS PHP源码 – 2023新版发布

最新的轻量级开源论坛php源码发布啦&#xff01;这是一款独立开发的论坛系统&#xff0c;可以帮助你快速地开发出你想要的网站。 如果你是PHP初学者&#xff0c;这款论坛系统非常适合你入门学习。不过&#xff0c;需要注意的是&#xff0c;由于它并没有进行商业化改造&#xf…

VC-旅游系统-213-(代码+说明)

转载地址: http://www.3q2008.com/soft/search.asp?keyword旅游系统 旅游信息管理系统开题报告 一、研究目的 旅游信息管理系统能帮助旅行社在游客的市场开拓、游客的信息管理、客户服务等方面进行综合处理。使旅行社能够准确的掌握客户的市场动态&#xff0c;充分了解对客户…