面试题———关于将一个整型数组中的所有元素组合成一个数字,并找出最小一个。

来源:互联网 发布:淘宝达摩盘 编辑:程序博客网 时间:2024/05/21 13:59


题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32,  321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。

在这里不仅需要得到这个数组里面所有的组合,而且要找到最小的那一个,并且还有一个问题,就是数组中排好的数可能溢出,所以就干脆把他们都转成字符串,这样比较字符串同样可以找到最小的那一个。所以最后的解决方法是,找到所有的排列方式,以字符串的形式存储,然后再找到最小的一个,这时我想到用map的key保存每种排列方式的字符串,这样,当我将所有的排列方式都保存完的时候,他们在map中已经是有序的,并且,map中第一个元素的key值就是我要找的最小的排列方式。

下面是实现代码:

#include <iostream>#include <map>#include <stdio.h>#include <string>using namespace std;void swap(int* num1, int* num2){int temp = *num1;*num1 = *num2;*num2 = temp;}void permute(int* inter, int k, int len,map<string,int>* nMap) //采用递归的方法找到每一种排列方式并以字符串的形式存入到map的key中{if (k == len){char szText1[12] = { 0 };char* szText2 = new char[len * 10];memset(szText2, 0, len * 10);for (int i = 0; i < len; i++){memset(szText1, 0, 12);_itoa_s(inter[i], szText1,sizeof(szText1)/sizeof(char), 10);strcat_s(szText2,len * 10, szText1);}nMap->insert(make_pair(string(szText2), 1));delete[] szText2;return;}else{for (int i = k; i < len; i++){swap(&inter[i], &inter[k]);permute(inter, k + 1, len,nMap);swap(&inter[i], &inter[k]);}}}int main(){map<string,int> nMap;int inter[] = { 9, 3, 4, 5 ,7,6,12,23,87};permute(inter, 0, sizeof(inter)/sizeof(int),&nMap);map<string,int> ::iterator it = nMap.begin();cout << it -> first << endl; // 大概用了10s时间,结果是122334567879return 0;}


突然又想到另一种方法,看来这个问题就是应该用下面的方法实现,直接将每个元素转换成字符串,放到list中,list的sort函数可以按字典序排序,排序之后遍历整个list输出结果,就是要的最小数了。不多说了,看代码:

#include "iostream"#include "algorithm"#include "stdio.h"#include <list>#include <string>using namespace std;void getMin(int* inter, int len,list<string>* str){char szText[12] = { 0 };for (int i = 0; i < len; i++){memset(szText, 0, sizeof(szText) / sizeof(char));_itoa_s(inter[i], szText, sizeof(szText) / sizeof(char), 10);str -> push_front(string(szText));}}int main(){list<string> str;int inter[] = { 2,3,1,4,56,4,3,2,87,6};getMin(inter, sizeof(inter)/sizeof(int),&str);str.sort();list<string>::iterator it;for (it = str.begin(); it != str.end(); it++){cout << *it;}cout << endl;return 0;}

这样就不需要我们去考虑每种情况了,list::sort会按照字典序排列每个元素,这样组合成的数就是最小的了。




0 0
原创粉丝点击