求正整数数组构成的最小数(某公司2013年校园招聘笔试试题)
2013-09-16 21:52
330 查看
题目是这样的:数组a的元素均为正整数,假设为:912, 345, 789, 那么形成的最小数为:345789912, 最大数为:912789345.请写出通用的求最小数的程序.
很多人说:简单啊,不就是冒泡排序吗?大的往后放就可以了,是么?你看看这个数组:21, 2. 形成的最小数是212, 最大数是221, 可见,这样冒泡是不对的。还有很多人说,简单啊,用字符串比较啊,比较字符串的大小啊,那好,你写一下,看看好不好写。
其实,本题还是应该用冒泡排序,只不过,要注意冒泡的方式和我们通常的冒泡方式有一定差异,程序如下:
很多人说:简单啊,不就是冒泡排序吗?大的往后放就可以了,是么?你看看这个数组:21, 2. 形成的最小数是212, 最大数是221, 可见,这样冒泡是不对的。还有很多人说,简单啊,用字符串比较啊,比较字符串的大小啊,那好,你写一下,看看好不好写。
其实,本题还是应该用冒泡排序,只不过,要注意冒泡的方式和我们通常的冒泡方式有一定差异,程序如下:
#include <iostream> using namespace std; // a:123, b:45, 则函数返回整数12345 int link(int a, int b) { int t = b; while(t) { a *= 10; t /= 10; } return a + b; } void swap(int &x, int &y) { int t = x; x = y; y = t; } // 非常规冒泡排序 void leastNumber(int a[], int n, char *outStr) { int i, j; for(i = 0; i < n - 1; i++) { for(j = 0; j < n - 1 - i; j++) { if(link(a[j], a[j + 1]) > link(a[j + 1], a[j])) { swap(a[j], a[j + 1]); } } } char str[100] = {0}; for(i = 0; i < n; i++) { itoa(a[i], str, 10); strcat(outStr, str); } } int main() { int a[] = {9, 60, 21, 2, 356}; int n = 5; char outStr[1000] = {0}; leastNumber(a, n, outStr); cout << outStr << endl; // 结果是: 212356609 return 0; }
相关文章推荐
- 整数数组中大于或等于平均数的元素个数(某公司校园招聘机试试题)
- 求数组中n-1个元素的乘积的最大值(某公司2007年校园招聘笔试试题)
- 整数无序数组求第K大数(暴力|快排) - 滴滴出行2018校园招聘内推笔试-研发工程师
- 某整形数组中除了两个单身整数外, 其余的整数都是成对出现的, 利用C/C++代码求出这两个单身整数。 要求: 时间复杂度o(n), 空间复杂度o(1)------某公司招聘试题
- 2013年世界校园招聘笔试试题
- 如何判断两个矩形是否有重叠部分?(某公司校园招聘笔试试题)
- 利用循环链表(单链)实现Josephus环(某公司校园招聘笔试试题)
- 某整形数组中除了两个单身整数外, 其余的整数都是成对出现的, 利用C/C++代码求出这两个单身整数。 要求: 时间复杂度o(n), 空间复杂度o(1)------某公司招聘试题
- A升杯子和B升的杯子如何倒出C升的水?(某公司校园招聘笔试试题,某另外公司校园招聘笔试试题)
- 骇人听闻的二分查找(某公司校园招聘笔试试题)(据说只有10%的程序员可以写出没有bug的二分查找)
- delete p 究竟把p怎么了?(某公司校园招聘笔试试题)
- 如何判断两个矩形是否有重叠部分?(某公司校园招聘笔试试题)
- 腾讯2013年校园招聘笔试试题
- 2015华为校园招聘机试题+1道2013年网易校园招聘笔试题
- 完全二叉树叶子节点数n0和总结点数N的关系 (某公司校园招聘笔试试题)
- 两个大整数相乘(某公司校园招聘机试试题)
- 判断表达式中括号是否匹配(栈的典型应用)(某公司校园招聘笔试试题)
- 时间复杂度为O(n)来判断数组a[N](1 <= a[i] <= N)中是否有重复元素 (某公司校园招聘笔试题目)
- 微软 2014年校园招聘笔试试题
- 微软2014校园招聘笔试试题