面试题———关于将一个整型数组中的所有元素组合成一个数字,并找出最小一个。
来源:互联网 发布:淘宝达摩盘 编辑:程序博客网 时间: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
- 面试题———关于将一个整型数组中的所有元素组合成一个数字,并找出最小一个。
- 面试题—— 找出一个无序整型数组中第k大的数。
- 找出一个整型数组中的元素的最大值
- 互联网面试题:一个数组中找出三个出现奇数次的数字中的一个
- 互联网面试题:一个数组中找出三个出现奇数次的数字中的一个
- 数据结构面试题总结5——数组:找出数组中唯一一个出现一次的元素
- 程序员面试题:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值
- 将数组中的元素排列成一个最小的数
- 将一个数组内元素的所有组合输出
- 从一个数据元素无序的整型数组中找出最小的两个数的下标
- (lodash_gcy)union—将给定的几个数组的唯一元素组合成一个数组
- 求出一个4×M整型二维数组中最小元素的值,并将此值返回调用函数
- 一道有趣的GOOGLE面试题——找出至少一个重复元素
- 提高篇项目1.3—随机数创建一个长度为16的整型数组a并初始化,删除数组中所有能被3整除的元素
- 将整型数组转成一个完整的整型数字
- [面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合
- [面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合
- 面试题——找出数组中不相同的所有元素(是数组,不是集合)
- 知识整理记载
- Mysql varchar型自增方法
- 【小熊刷题】sqrt(x) <Leetcode 69 Java>
- 打造自己的注解框架
- Xcode启动基本知识点介绍
- 面试题———关于将一个整型数组中的所有元素组合成一个数字,并找出最小一个。
- 网路基础(python)
- hud 2795 Billboard || HDOJ 2009 Summer Exercise(5) || 线段树
- TQ2440 学习笔记—— 23、通用异步收发器 UART
- nyoj 相同的雪花
- 精通Hibernate——HQL查询详解
- 2015,继续寻找。。
- 用SJ定理解决Anti-SG游戏
- MyEclipse下Tomcat无法部署项目 finish按钮无法点击