剑指Offer----面试题33:把数组排成最小的数
2016-07-30 17:59
429 查看
题目:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼出得搜数字中最小的一个。例如输入{3,32,321},则打印出这3个数字能排成的最小数字321323.方法一:
分析:先求出这个数组中所有数字的全排列,然后把每个排列拼接起来,最后求出拼接起来的数字的最小值。源代码:
#include<iostream> #include<string> #include<vector> using namespace std; void Permutation(int *arr, int length, int index, vector<int> &vec); void swap(int *A, int *B) { int temp = *A; *A = *B; *B = temp; } void Permutation(int *arr, int length) { if (arr == nullptr || length <=0) return; vector<int> vec; Permutation(arr, length, 0, vec);//数组的全排列 int minNum = *vec.cbegin(); for (auto it = vec.cbegin(); it != vec.cend(); ++it) { cout << *it << " "; if (minNum > *it) minNum = *it; } cout << "\nMin = " << minNum << endl; } void Permutation(int *arr, int length, int index, vector<int> &vec) { if (index == length) { string str; for (int i = 0; i < length; ++i) { str += to_string(arr[i]); } int temp = stoi(str); vec.push_back(temp); } else { for (int i = index; i < length; ++i) { swap(arr + i, arr + index); Permutation(arr, length, index + 1, vec); swap(arr + i, arr + index); } } } void test1() { cout << "=================test1:{3,32,321}=========" << endl; int arr[] = { 3, 32, 321 }; Permutation(arr, 3); cout << endl; } int main() { test1(); system("pause"); return 0; }
运行结果:
=================test1:{3,32,321}========= 332321 332132 323321 323213 321323 321332 Min = 321323 请按任意键继续. . .
方法二:
待续。。。。相关文章推荐
- 一个关于if else容易迷惑的问题
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- 一道sql面试题附答案
- C# 超高面试题收集整理
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例