Largest Number

本文探讨了如何通过定义特殊的字符串排序标准来解决将整数转换为字符串并排列成最大数值的问题,特别关注于大数值的处理,确保最终结果以字符串形式返回。

Given a list of non negative integers, arrange them such that they form the largest number.

For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.

Note: The result may be very large, so you need to return a string instead of an integer.

解题思路:首先将Int转化为字符串,定义一个字符串的排序标准进行排序;

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<sstream>
using namespace std;
bool CompareString(const string &s1,const string &s2)
{
	return (s1 + s2) > (s2 + s1);          //  比较标准
}
void Fast_short(vector<string>&NumStrVector, int begin, int end, bool(*compare)(const string &, const string &))
{
	if (begin<end){
		string target = NumStrVector[end];
		int    s = begin;
		for (int idx = begin; idx != end;++idx){
			if (compare(NumStrVector[idx],target))
			{
				string tmp = NumStrVector[s];
				NumStrVector[s] = NumStrVector[idx];
				NumStrVector[idx] = tmp;
				++s;	
			}
		}
		string tmp = NumStrVector[s];
		NumStrVector[s] = NumStrVector[end];
		NumStrVector[end] = tmp;
		Fast_short(NumStrVector, begin, s-1, compare);
		Fast_short(NumStrVector, s + 1, end, compare);
	}
}
string largestNumber(vector<int> &num) {
	vector<string>NumStrVector(num.size());
	for (int i = 0; i != num.size();++i){
		stringstream ss;
		ss << num[i];
		ss >> NumStrVector[i];
	}
	if (NumStrVector.size() == 1)
		return NumStrVector[0];
	Fast_short(NumStrVector,0,NumStrVector.size()-1, CompareString);
	//sort(NumStrVector.begin(), NumStrVector.end(), CompareString);
	string ResultStr;
	for_each(NumStrVector.begin(), NumStrVector.end(), [&ResultStr](const string s){ResultStr += s; });
	for (int i = 0; i != ResultStr.size();++i){        //前置0情况处理
		if (ResultStr[i] != '0')
			return ResultStr.substr(i);
	}
	return ResultStr.substr(ResultStr.size() - 1);
}



# 题目重述 输入三个数 $a, b, c$,输出其中最大值,但结果出现异常值 $-858993460$,为何会出现这种情况? # 详解 该现象通常出现在 **C/C++ 编写的程序中**,尤其是未正确初始化变量或未正确读取输入的情况下。错误输出 $-858993460$ 是一个典型的**未初始化内存的默认值**(常见于 Visual Studio 调试环境,十六进制为 `0xCCCCCCCC`,表示未初始化栈内存)。 可能的错误代码示例如下(C语言): ```c #include <stdio.h> int main() { int a, b, c, max; printf("please input a,b,c\n"); scanf("%d %d %d", &a, &b, &c); if (a > b && a > c) max = a; else if (b > a && b > c) max = b; else if (c > a && c > b) max = c; printf("the largest number is %d\n", max); // 此处 max 可能未被赋值 return 0; } ``` **问题出在逻辑不完整**:当两个数相等且大于第三个数时(如 $a = b > c$),前两个条件不成立,而第三个条件 `c > a && c > b` 也不成立,导致 `max` 未被赋值,使用了未定义值。 更严重的是:若 $a = b = c$,则所有判断都失败,`max` 完全未赋值,导致打印**随机内存值**,即出现类似 $-858993460$ 的结果。 ### 正确做法: 应确保所有情况都被覆盖,推荐使用 `else` 覆盖最后情形: ```c if (a >= b && a >= c) max = a; else if (b >= a && b >= c) max = b; else max = c; ``` 或使用嵌套比较避免遗漏。 # 知识点(列出解答该问题需要的知识点) - **变量初始化**:未初始化局部变量会包含不确定值,导致不可预测行为。 - **条件语句完整性**:分支逻辑必须覆盖所有可能情况,防止漏判。 - **输入输出匹配**:确保 `scanf` 成功读取数据,否则变量保持未定义状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值