【華為OD】MVP爭奪戰2(C++、Java、Python)

文章目錄

  • 題目
    • 題目描述
    • 輸入描述
    • 輸出描述
    • 示例
  • 思路
    • 核心思路:
    • 關鍵觀察:
    • 算法步驟:
    • 排序策略:
    • 特殊情況處理:
  • 代碼
    • C++
    • Java
    • Python
  • 復雜度分析
    • 時間復雜度
    • 空間復雜度
  • 結果
  • 總結

題目

題目描述

給定一個整型數組,請從該數組中選擇3個元素組成最小數字并輸出。

(如果數組長度小于3,則選擇數組中所有元素來組成最小數字)。

輸入描述

一行用半角逗號分割的字符串記錄的整型數組,0 < 數組長度 <= 100,0 < 整數的取值范圍 <= 10000。

輸出描述

由3個元素組成的最小數字,如果數組長度小于3,則選擇數組中所有元素來組成最小數字。

示例

示例1:

輸入:21,30,62,5,31
輸出:21305
說明:數組長度超過3,需要選3個元素組成最小數字,21305由21,30,5三個元素組成的數字,為所有組合中最小的數字。

示例2:

輸入:5,21
輸出:215
說明:數組長度小于3,選擇所有元素來組成最小值,215為最小值。

題目鏈接🔗

思路

這是一個數字組合優化問題,需要找到能組成最小數字的策略:

核心思路:

  1. 數組長度 < 3: 直接使用所有元素
  2. 數組長度 ≥ 3: 選擇3個元素,使組成的數字最小

關鍵觀察:

  • 要讓組成的數字最小,需要考慮兩個因素:
    1. 數字位數越少越好
    2. 高位數字越小越好

算法步驟:

  1. 數字排序: 按數值大小升序排列,選擇前3個較小的數字
  2. 組合排序: 對選中的數字按照拼接結果的字典序排序
  3. 拼接輸出: 將排序后的數字拼接成最終結果

排序策略:

關鍵在于第二步的排序規則:對于兩個數字 a 和 b,如果 a+b < b+a(字符串拼接比較),則 a 應該排在 b 前面。

例如:

  • 數字 21 和 30:比較 “2130” 和 “3021”,因為 “2130” < “3021”,所以 21 排在 30 前面
  • 數字 30 和 5:比較 “305” 和 “530”,因為 “305” < “530”,所以 30 排在 5 前面

特殊情況處理:

  • 數組長度 < 3 時,直接對所有元素按組合規則排序
  • 數組長度 ≥ 3 時,先選擇數值最小的3個元素,再按組合規則排序

代碼

C++

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MIN(a,b) ((a) < (b) ? (a) : (b))
#define MAX_SIZE 100int cmp1(const void* a, const void* b) {int A;sscanf(*(char**) a, "%d", &A);int B;sscanf(*(char**) b, "%d", &B);return A - B;
}int cmp2(const void* a, const void* b) {char* A = *((char**) a);char* B = *((char**) b);char AB[10000] = {'\0'};strcat(AB, A);strcat(AB, B);char BA[10000] = {'\0'};strcat(BA, B);strcat(BA, A);return strcmp(AB, BA);
}int main() {char line[10000];gets(line);char* ss[MAX_SIZE];int ss_size = 0;char* token = strtok(line, ",");while(token != NULL) {ss[ss_size++] = token;token = strtok(NULL, ",");}qsort(ss, ss_size, sizeof(char*), cmp1);int size = MIN(3, ss_size);qsort(ss, size, sizeof(char*), cmp2);char res[10000];for(int i=0; i<size; i++) {strcat(res, ss[i]);}puts(res);return 0;
}

Java

import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String[] strs = sc.nextLine().split(",");System.out.println(getResult(strs));}public static String getResult(String[] strs) {// 按數值大小升序排列Arrays.sort(strs, (a, b) -> Integer.parseInt(a) - Integer.parseInt(b));// 取前3個元素(如果數組長度小于3,則取所有元素)String[] tmp = Arrays.copyOfRange(strs, 0, Math.min(3, strs.length));// 按照拼接結果的字典序排序Arrays.sort(tmp, (a, b) -> (a + b).compareTo(b + a));StringBuilder sb = new StringBuilder();for (String s : tmp) {sb.append(s);}return sb.toString();}
}

Python

import functools# 輸入獲取
strs = input().split(",")# 自定義比較函數
def cmp(a, b):s1 = a + bs2 = b + areturn 0 if s1 == s2 else 1 if s1 > s2 else -1def getResult(strs):# 按數值大小升序排列strs.sort(key=lambda x: int(x))# 取前3個元素tmp = strs[:3]# 按照拼接結果的字典序排序tmp.sort(key=functools.cmp_to_key(cmp))return "".join(tmp)# 算法調用
print(getResult(strs))

復雜度分析

時間復雜度

  • 第一次排序: O(n log n) - 按數值大小排序
  • 第二次排序: O(k log k),其中 k = min(3, n) - 按組合規則排序
  • 總時間復雜度: O(n log n)

空間復雜度

  • 輔助數組: O(k),其中 k = min(3, n) - 存儲選中的元素
  • 字符串拼接: O(L),其中 L 是數字的總長度
  • 總空間復雜度: O(n)

結果

通過所有測試用例,算法能夠正確處理各種輸入情況:

  • 數組長度小于3的情況
  • 數組長度等于3的情況
  • 數組長度大于3的情況

總結

本題是一個典型的貪心算法問題,關鍵在于:

  1. 貪心策略: 選擇數值最小的3個元素,保證組成數字的位數最少
  2. 排序技巧: 使用自定義比較器,通過字符串拼接比較來確定最優排列
  3. 邊界處理: 正確處理數組長度小于3的特殊情況

這道題目考查了:

  • 貪心算法的應用
  • 自定義排序比較器的使用
  • 字符串處理技巧
  • 邊界條件的處理

通過這道題可以加深對貪心算法和排序算法的理解,特別是如何設計合適的比較函數來解決復雜的排序問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89014.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89014.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89014.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python打卡訓練營Day58

DAY 58 經典時序預測模型2知識點回顧&#xff1a;時序建模的流程時序任務經典單變量數據集ARIMA&#xff08;p&#xff0c;d&#xff0c;q&#xff09;模型實戰SARIMA摘要圖的理解處理不平穩的2種差分n階差分---處理趨勢季節性差分---處理季節性建立一個ARIMA模型&#xff0c;通…

003大模型基礎知識

大模型分類&#xff1a; 技術架構&#xff1a; Encoder Only Bert Decoder Only 著名的大模型都是 Encoder - Decoder T5 是否開源&#xff1a; 開源陣營&#xff1a; Llama DeepSeek Qwen 閉源陣營&#xff1a; ChatGpt Gemini Claude 語言模型發展階段&am…

JVM監控及診斷工具-GUI篇

19.1. 工具概述 使用上一章命令行工具或組合能幫您獲取目標Java應用性能相關的基礎信息&#xff0c;但它們存在下列局限&#xff1a; 1&#xff0e;無法獲取方法級別的分析數據&#xff0c;如方法間的調用關系、各方法的調用次數和調用時間等&#xff08;這對定位應用性能瓶頸…

適用于Windows系統截圖工具

1.Faststone Capture 官網網址&#xff1a;https://faststone-capture.com/ 網上很多注冊碼&#xff1a;https://www.cnblogs.com/LiuYanYGZ/p/16839503.html 2.Snipaste 官網網址&#xff1a;https://apps.microsoft.com/detail/9p1wxpkb68kx?launchtrue&modefull&…

區塊鏈的三種共識機制——PoW、PoS和DPoS原理

區塊鏈的核心是去中心化網絡的信任機制&#xff0c;而共識機制是實現這一目標的關鍵。共識機制可分為兩個階段&#xff1a;&#xff08;1&#xff09;提出共識內容&#xff08;2&#xff09;對內容達成共識&#xff08;遵循最長鏈原則&#xff09;。三種主流的共識機制主要有工…

React 和 Vue的自定義Hooks是如何實現的,如何創建自定義鉤子

目的&#xff1a;將公共邏輯提取出來&#xff0c;類似于 mixin&#xff0c;解決了mixin的設計缺陷。 React 和 Vue 自定義 Hooks 實現對比 React 自定義 Hooks React 的自定義 Hooks 是 JavaScript 函數&#xff0c;它們以 use 開頭&#xff0c;可以調用其他 Hooks。 基本規則 …

構建高效事件驅動架構:AWS S3與SQS集成實踐指南

引言 在現代云架構中,事件驅動的設計模式越來越受到開發者的青睞。AWS S3與SQS的集成為我們提供了一個強大的事件處理機制,能夠在文件上傳、刪除或修改時自動觸發后續的業務邏輯。本文將詳細介紹如何配置S3事件通知到SQS隊列,并分享實際項目中的最佳實踐。 架構概述 S3事…

C++ -- STL-- List

////// 歡迎來到 aramae 的博客&#xff0c;愿 Bug 遠離&#xff0c;好運常伴&#xff01; ////// 博主的Gitee地址&#xff1a;阿拉美 (aramae) - Gitee.com 時代不會辜負長期主義者&#xff0c;愿每一個努力的人都能達到理想的彼岸。1. list的介紹及使用 2. list的深度剖…

rt-thread 線程間同步方法詳解

rt-thread 線程間同步方法詳解一、什么是線程間同步線程同步的必要性線程同步的挑戰二、同步方式1、信號量信號量工作機制信號量的管理方式信號量的創建與刪除信號量的獲取與釋放信號量的典型應用場景信號量的注意事項2、互斥量互斥量工作機制互斥量的特性互斥量的操作接口互斥…

Spring Boot + Vue2 實現騰訊云 COS 文件上傳:從零搭建分片上傳系統

目錄 一、項目目標 二、騰訊云 COS 基本配置 1. 創建存儲桶 2. 獲取 API 密鑰 3. 設置跨域規則&#xff08;CORS&#xff09; 三、后端&#xff08;Spring Boot&#xff09;實現 1. 依賴配置 2. 配置騰訊云 COS&#xff08;application.yml&#xff09; 3. 初始化 COS…

使用 Java 獲取 PDF 頁面信息(頁數、尺寸、旋轉角度、方向、標簽與邊框)

目錄 引言 一、安裝和引入PDF處理庫 二、獲取 PDF 頁數 三、獲取頁面尺寸&#xff08;寬高&#xff09; 四、獲取頁面旋轉角度 五、判斷頁面方向&#xff08;橫向 / 縱向&#xff09; 六、獲取頁面標簽 七、獲取頁面邊框信息 八、總結 引言 了解 PDF 頁面屬性是我們在…

基于 AI 的大前端安全態勢感知與應急響應體系建設

大前端應用&#xff08;Web、APP、小程序&#xff09;作為用戶交互的入口&#xff0c;面臨日益復雜的安全威脅&#xff1a;從傳統的 XSS 攻擊、CSRF 偽造&#xff0c;到新型的供應鏈投毒、AI 驅動的自動化爬蟲&#xff0c;再到針對業務邏輯的欺詐攻擊&#xff08;如薅羊毛、賬號…

Java 與 MySQL 性能優化:MySQL全文檢索查詢優化實踐

文章目錄一、引言二、InnoDB引擎下的全文檢索功能詳解2.1 全文索引的基本概念與原理2.2 全文索引的創建與管理2.3 全文檢索的三種查詢模式2.4 中文全文檢索的挑戰與解決方案三、CMS 場景下的全文檢索性能瓶頸分析3.1 索引構建與維護開銷3.2 查詢性能瓶頸3.3 鎖機制與并發性能問…

應用軟件格式滲透 利用word去滲透(MS10-087)

用到的靶機為&#xff1a;WinXP漏洞原理&#xff1a;一、漏洞觸發機制與核心組件 漏洞根源&#xff1a;RTF文件解析邏輯缺陷 觸發組件&#xff1a;Microsoft Word的RTF&#xff08;Rich Text Format&#xff09;解析引擎&#xff0c;具體涉及 mso.dll 模塊中的 路徑規范化函數&…

解密AWS VPC路由表:顯式關聯與隱式關聯,誰決定了網絡出口?

大家好&#xff0c;今天我們來聊一個在 AWS 云計算世界里既基礎又關鍵的話題&#xff1a;VPC 路由表。 很多剛接觸 AWS 的朋友&#xff0c;在配置網絡時可能會遇到這樣的困惑&#xff1a;為什么我的 EC2 實例無法訪問互聯網&#xff1f;為什么某些子網的網絡策略和其他子網不一…

LeetCode題解---<203.移除鏈表元素>

文章目錄題目代碼及注釋關鍵點題目 給你一個鏈表的頭節點 head 和一個整數 val &#xff0c;請你刪除鏈表中所有滿足 Node.val val 的節點&#xff0c;并返回 新的頭節點 。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,6,3,4,5,6], val 6 輸出&#xff1a;[1,2,3,4,…

【JavaScript高級】構造函數、原型鏈與數據處理

目錄構造函數和原型構造函數實例成員和靜態成員構造函數的問題構造函數原型 prototype對象原型 \_\_proto\_\_constructor 構造函數構造函數、實例、原型對象三者之間的關系原型鏈JavaScript 的成員查找機制&#xff08;規則&#xff09;原型對象的this指向擴展內置對象繼承cal…

項目進度與預算脫節,如何進行同步管理

項目進度與預算脫節會導致資源浪費、成本超支和項目延期。進行同步管理的方法包括&#xff1a;建立統一的項目進度預算管理體系、實施實時監控與反饋機制、采用項目管理工具輔助同步管理。尤其是實施實時監控與反饋機制&#xff0c;通過持續監測進度與預算的匹配情況&#xff0…

TCP半關閉

理解TCP半關閉&#xff1a;像水管一樣的網絡連接控制 從全關閉到半關閉&#xff1a;為什么需要這種機制&#xff1f; 想象你和朋友正在通電話討論一個重要項目&#xff1a; 全關閉&#xff1a;就像突然掛斷電話&#xff0c;雙方都無法再說話半關閉&#xff1a;你說"我說完…

衡石科技技術手冊--儀表盤過濾控件詳解

過濾控件說明 過濾控件 的定義 過濾控件用于在儀表盤中過濾圖表數據&#xff0c;分為儀表盤內過濾控件和全局過濾控件。 過濾控件結構說明 字段類型描述uidSTRING過濾控件唯一識別 idappIdLONG過濾控件所屬的應用 iddataAppIdLONG字段來源是數據包時的數據包 iddashboar…