华为OD机试E卷 --最整数--24年OD统一考试(Java)

给定—组整数(非负),重排顺序后输出一个最大的整数。
示例1
输入:[10,9]输出:910
说明:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

输入描述

数字组合

输出描述

最大的整数

用例

输入

10 9

输出

910

 java

package odTest;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

public class maxInt {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		LinkedList<Integer> list = new LinkedList<Integer>();
		int[] inputs = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray() ;
		for(int i=0;i<inputs.length;i++) {
				list=judgeSequence(list,inputs[i]);
		}
		
	    list.forEach(i->{System.out.print(i+"");});
	}
    
	private static LinkedList<Integer> judgeSequence(LinkedList<Integer> list, int input) {
		if(list.size()==0) {
			list.add(input);
			return list;
		}
		for(int i=0;i<list.size();i++) {
			if(judgeMethod(list.get(i)+"",input+"")) {
				list.add(i, input);
				return list;
			}
			if(i == list.size()-1) {
				list.add(input);
			}
		}
		return list;
		
	}
	
	//如果返回为true,就交换两个数的位置
	private static boolean judgeMethod(String s, String input) {
		char[] x = s.toCharArray();
		char[] y = input.toCharArray();
		//获取最短长度
		int len = x.length>=y.length?y.length:x.length;
		
		for(int i=0;i<len;i++) {
			//重头开始一一判断,只要输入大于就返回true,小于就返回false,相等就判断长度,短的放前面。
			if(x[i]<y[i]) {
				return true;
			}else if(x[i]>y[i]) {
				return false;
			}else {
				return x.length>=y.length?true:false;
			}
		}
		return false;
		
	}

}

### 关于华为ODE中的斗地主之顺子题目 #### 题目背景 华为ODE作为新版本的考试,在继承原有ABCD的基础上加入了新的题目类型。其中,“斗地主之顺子”是一个典型的算法设计类问题,主要考察考生对于数组操作、排序以及逻辑判断的能力[^1]。 #### 题目描述 给定一组扑克牌编号列表(假设每张牌都有唯一的整数编号),要求从中找出长的一组连续顺子序列。所谓顺子是指一系列按顺序排列的数字,例如 `[3, 4, 5, 6, 7]` 是一个长度为5的顺子。需要注意的是,输入数据可能包含重复项或者缺失某些中间值的情况。程序应返回能够构成的大顺子长度及其起始位置[^2]。 #### 解决方案概述 解决该问题的关键在于如何高效处理数据并识别出符合条件的子序列。以下是具体实现方法: 1. **去重与排序**: 使用集合(Set)去除掉所有重复元素后再将其转换成有序形式以便进一步计算。 2. **动态规划思想应用**: 创建辅助变量记录当前已知大顺子长度以及临时计数值用于遍历过程中的实时跟踪。 3. **边界条件考虑**: 特殊情况如只有一个唯一元素时需单独讨论以防错误判定。 下面给出基于 Python 的解决方案代码示例: ```python def longest_consecutive(nums): if not nums: return 0 num_set = set(nums) # 去除重复元素 max_length = 0 for num in num_set: if num - 1 not in num_set: # 只有当num是某个潜在顺子的第一个成员才进入此分支 current_num = num current_streak = 1 while current_num + 1 in num_set: # 寻找下一个相连的数字直到找不到为止 current_num += 1 current_streak += 1 max_length = max(max_length, current_streak) return max_length # 测用例 test_case = [100, 4, 200, 1, 3, 2] print(longest_consecutive(test_case)) # 输出应该是4因为存在[1, 2, 3, 4] ``` 上述函数通过构建无序集合来快速查找是否存在相邻数字,并利用简单的循环结构实现了时间复杂度接近O(n)的效果。 #### 复杂度分析 - 时间复杂度:由于采用了哈希表(set)来进行常量级查询操作,整体流程大致维持在线性级别即 O(N),这里 N 表示原始数组大小。 - 空间复杂度:额外开辟了一个同等规模的空间存储独一无二的数据副本因此也是 O(N)[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值