user-0 提问: 求大佬们解答！！！

回复:
user: user-1
content: 引用 14 楼 juge0007 的回复:没有搞懂什么是不影响原有顺序，照你这么说的话，输出应该是4312，而不应该是432。还有它输出上写的432应该是说，我输入的这串数字按照它要求的输出应该是432。  首先整形范围-32768----32767，所以输入数据需要用长整形。  其次这题明显是要得到一组去重后的数据，然后比较大小后去最大值。  看列子： 423234去重后  423 432 234 324 324 234 取起其中最大值432  你的程序直接先排序？？？这里肯定错了

user: user-2
content: 应该改成long型估计就没问题了

user: user-3
content: 那自测输出也应该是4321啊，第一张图是华为考试网页上的自测输出，第二张图是自己编译器的输出

user: user-4
content: 你是不是没有按照顺序啊 不应该是423吗

user: user-0
content: 引用 9 楼 zangfong 的回复：我觉得是楼主你自己理解错了，题意是不能改变原有数字的顺序，取得消除重复数字后的最大整数，但是你提供的这个界面显示的是自测调试，也就是对你自己的这段程序，输入你自己的测试用例进行调试，而这里出来的结果应该也是你自己程序跑出来的结果，并非标准答案。看了下楼主的代码，如果直接用1234作为测试用例，输出的是4321，如果你拿这个测试用例去网上进行自测调试，出来的应该也是4321。。。而且题意并没有表达出不能改变顺序

user: user-0
content: 引用 9 楼 zangfong 的回复：我觉得是楼主你自己理解错了，题意是不能改变原有数字的顺序，取得消除重复数字后的最大整数，但是你提供的这个界面显示的是自测调试，也就是对你自己的这段程序，输入你自己的测试用例进行调试，而这里出来的结果应该也是你自己程序跑出来的结果，并非标准答案。看了下楼主的代码，如果直接用1234作为测试用例，输出的是4321，如果你拿这个测试用例去网上进行自测调试，出来的应该也是4321。。。那自测输出也应该是4321啊，第一张图是华为考试网页上的自测输出，第二张图是自己编译器的输出

user: user-0
content: 引用 7 楼 niiiloc 的回复：都说长整数了，你还用int不就是找罪受么我用的long，而且我都试过，long和int输进去，通过率还是20%，没区别

user: user-5
content: 按照楼主的意思，并且自测的4312，不知道为什么楼主有排序的过程，感觉不应该有排序的过程，可以利用栈的感觉吧，不断比较是否重复，并且比较大小。蹭分

user: user-6
content: 我觉得是楼主你自己理解错了，题意是不能改变原有数字的顺序，取得消除重复数字后的最大整数，但是你提供的这个界面显示的是自测调试，也就是对你自己的这段程序，输入你自己的测试用例进行调试，而这里出来的结果应该也是你自己程序跑出来的结果，并非标准答案。看了下楼主的代码，如果直接用1234作为测试用例，输出的是4321，如果你拿这个测试用例去网上进行自测调试，出来的应该也是4321。。。

user: user-7
content: 321423412改变顺序输出结果是4321，不改变顺序输出结果是4312 题目没明示是哪种算法，两种都试试呗

user: user-7
content: 都说长整数了，你还用int不就是找罪受么

user: user-0
content: 引用 1 楼 Slzde_sub 的回复:  首先 既然是长整数， 就用long long吧， 无非就是范围大一些，确又没有直接指明需要字符串解决，所以long long肯定够用  既然是华为的题，，虽然也是签到题，，  应该是在不影响原有的数字顺序的情况下，不然就这题就是真水题了  没有存在的意义  所以你的自测数据只能得到432  你改变了数据原有的排序顺序，在这题意的逻辑上是错误的  这种题一看就是贪心，虽然数据不大，暴力也可以  思路就是先将第一个数push到stack中，然后向后查找，当查找到比该数大的数时候，判断后面是否留有该数，有的话就把较大数替换该数，  例如你先将3 push ，向后查找，到4发现4>3，而4后的数字中又依旧存在3，就把4替换3，然后再从4后的2开始重复这个过程    经过大家的提示，我大概知道为什么了，题目说了注意考虑长整数，不仅是说考虑输入的数是长整数，而且输出的数也可能是长整数： sort(num, i); int count = xiaochu(num, i);  int temp = 0;  for(int j = 0; j < count; j++) temp = temp * 10 + num[j];  printf("%d\n", temp); //system("pause");  return 0;  这里的temp是用来保存最后输出的最大整数的，应该改成long型估计就没问题了

user: user-6
content: 题意的表达也许有问题，不过既然是华为的面试题，网上百度一下，还是有不少代码可以供参考的，先搞一份来试试看，确定题意了之后再按照自己的思路动手写一遍，应该也是有所收获的吧。 引用 12 楼 juge0007 的回复:引用 9 楼 zangfong 的回复：我觉得是楼主你自己理解错了，题意是不能改变原有数字的顺序，取得消除重复数字后的最大整数，但是你提供的这个界面显示的是自测调试，也就是对你自己的这段程序，输入你自己的测试用例进行调试，而这里出来的结果应该也是你自己程序跑出来的结果，并非标准答案。看了下楼主的代码，如果直接用1234作为测试用例，输出的是4321，如果你拿这个测试用例去网上进行自测调试，出来的应该也是4321。。。而且题意并没有表达出不能改变顺序

user: user-0
content: 引用 5 楼 酷冷小少 的回复：不影响原有数字顺序就是  12343===>有两种结果一种是1234，一种是1243，这两种结果都没有影响原有数字顺序，题目没说去掉哪一个重复数字，我的理解是这样，至于你说的你输入的那数字正确答案是432，我是不理解的，一个1都没有，确定这是官方给的正确答案吗。是啊，这也是我困惑的地方

user: user-8
content: 不影响原有数字顺序就是  12343===>有两种结果一种是1234，一种是1243，这两种结果都没有影响原有数字顺序，题目没说去掉哪一个重复数字，我的理解是这样，至于你说的你输入的那数字正确答案是432，我是不理解的，一个1都没有，确定这是官方给的正确答案吗。

user: user-0
content: 引用 1 楼 Slzde_sub 的回复：  首先 既然是长整数， 就用long long吧， 无非就是范围大一些，确又没有直接指明需要字符串解决，所以long long肯定够用  既然是华为的题，，虽然也是签到题，，  应该是在不影响原有的数字顺序的情况下，不然就这题就是真水题了  没有存在的意义  所以你的自测数据只能得到432  你改变了数据原有的排序顺序，在这题意的逻辑上是错误的  这种题一看就是贪心，虽然数据不大，暴力也可以  思路就是先将第一个数push到stack中，然后向后查找，当查找到比该数大的数时候，判断后面是否留有该数，有的话就把较大数替换该数，  例如你先将3 push ，向后查找，到4发现4>3，而4后的数字中又依旧存在3，就把4替换3，然后再从4后的2开始重复这个过程  三楼

user: user-0
content: 没有搞懂什么是不影响原有顺序，照你这么说的话，输出应该是4312，而不应该是432。还有它输出上写的432应该是说，我输入的这串数字按照它要求的输出应该是432。

user: user-8
content: 应该如楼上所说，消除重复数字的时候不能改变原有数字的顺序，要不然，去下重，由大到小排出来没多大意义，题目中给出的432 看着像是直接由大到小排出来的，但是仔细看一下，它没有改变原有数字顺序，考点应该在这里。不能改变原有数字顺序也有两种情况，6523555 & 6563555 ，楼上已经给出了具体算法，我只是锦上添点花，蹭蹭分。