pow(x,y)在#include<math.h>文件中,计算x的y次方。

C++引入头文件:#include <stdlib.h> 或者 #include <cstdlib>

1、整数转化为字符串的方法:

1.1 atoi原型:注意:参数若为string类型一定转换成char*型(str.c_str())

  1. #include <stilib.h>或者#include<cstdlib>
  2. int atoi(const char *str);

atoi作用:把str字符串转换成整型数。如果第一个非空格字符不存在或者不是数字也不是正负号则返回零,否则开始做类型转换,之后检测到非数字或结束符 \0 时停止转换,返回整型数。

itoa原型

  1. #include<cstdlib>或者#include<stdlib.h>
  2. char *str[20];
  3. char* itoa(int num, char* str, int radix);

itoa作用:将value所代表的整数转换为字符串。其中,value是要转换的整数值,string是存储转换后值的字符数组,radix代表进制,radix=10就是十进制,radix=2就是二进制。

itoa值得注意的是:

1. 第二个参数只能是char*型,不能是string型;

2. 第二个参数在使用之前必须提前分配存储空间,在C++中就是new一块内存。

1.2 C++中整数转换为string。

stringstream( )
     <sstream.h>
 例如:
       int hello=4;
       stringstream ss;
       ss<<hello;
       string   s=ss.str();
     //调用string的方法
       cout<<s.c_str()<<endl;

1.3 sprintf

sprintf指的是字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。sprintf 是个变参函数。使用sprintf 对于写入buffer的字符数是没有限制的,这就存在了buffer溢出的可能性。

char buf[10];
sprintf(buf, "%d", 100);
string b = buf;

上面将100转化为字符串。

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

思路:

1、最原始的方法使用permutation得到所有的全排列,然后将每个排列转化为整数,比较得出最小的整数。大数很容易越界,超出计算机表示范围。

#include<iostream>
#include<vector>
#include<sstream>
#include<unordered_map>
#include<math.h>using namespace std;void helper(vector<int>& numbers, vector<int> visited, vector<vector<int>> &result, vector<int> tmp) {if (tmp.size() == numbers.size()) {result.push_back(tmp);return;}for (int i = 0; i < numbers.size(); ++i) {if (i != 0 && numbers[i] == numbers[i - 1] && visited[i - 1] == 0 || visited[i] == 1) {continue;}visited[i] = 1;tmp.push_back(numbers[i]);helper(numbers, visited, result, tmp);tmp.pop_back();visited[i] = 0;}
}
int permutation(vector<int>& numbers) {vector<vector<int>> result;int minNum = INT_MAX;vector<int> Tmp;if (numbers.size() == 0) {return 0;}vector<int> visited(numbers.size(), 0);helper(numbers, visited, result, Tmp);unordered_map<int, int> hashMap;for (int n : numbers) {int countPos = 0;int n1 = n;while (n != 0) {n = n / 10;++countPos;}cout << "countPos " << countPos << " " << n1 << "        ";hashMap.insert(make_pair(n1,countPos));}for (vector<int> tmp : result) {//将数组转化为整数    int num = 0;int countP = 0;for (int i = 0; i < tmp.size(); ++i) {//cout << tmp[i] << " ";if (i == 0) {num = tmp[i];}else {cout << "///" << hashMap[tmp[i - 1]];countP += hashMap[tmp[i - 1]];num += tmp[i] * (pow(10, countP));}}cout << endl;cout << num << " ";cout << "*************************" << endl;if (minNum > num) {minNum = num;}}cout << minNum;return minNum;
}
string PrintMinNumber(vector<int>& numbers) {int result = permutation(numbers);istringstream ss(result);string s;ss >> s;return s;
}
int main() {vector<int> numbers{ 3,32,321 };cout << PrintMinNumber(numbers) << endl;system("pause");}

permutation计算最小数

2、编写排序函数,利用sort函数,编写定制函数进行排序。

sort函数介绍。cmp函数不能修改传进去的参数。借口string a,或者const string &a;

在类里面写定制函数的时候,记得需要在定制函数前面加上static,原因是: 在类的成员函数使用带谓词的sort()函数

原因:sort()函数接受二元谓词,但是在类内定义的myCompare函数作为成员函数,实际上有三个参数,this指针、m、n。 
解决方案: 
1、将myCompare()函数挪到类定义的外面,即改为非成员函数; 
2、将myCompare()函数定义为静态成员函数,没有this指针。 
3、将myCompare()函数定义为类的友元函数,但是此时必须在类外声明该函数,否则,即使在类内定义了该友元函数,该函数仍然是不可见的。

class Solution {
public:static bool cmp(const string& a,const string& b){string s1 = a + b;string s2 = b + a;return s1 < s2;}string PrintMinNumber(vector<int> numbers) {string result;if(numbers.size() == 0){return result;}vector<string> numString;for(int Tmp : numbers){numString.push_back(to_string(Tmp));}sort(numString.begin(),numString.end(),cmp);for(string tmp : numString){result.append(tmp);}return result;}};

上面的方法需要证明:

组合数学里面的自反性,对称性,传递性。

转载于:https://www.cnblogs.com/dingxiaoqiang/p/7483934.html

剑指offer 把数组排成最小的数 atoi和itoa,pow相关推荐

  1. 4-剑指offer: 把数组排成最小的数

    题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 代码: cl ...

  2. 剑指offer 旋转数组的最小数字

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组 ...

  3. [剑指offer] 旋转数组的最小数字

    本文首发于我的个人博客:尾尾部落 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2 ...

  4. 剑指offer之数组中重复的数(Java实现)

    数组中重复的数 NowCoder 题目描述 在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的, 也不知道每个数字重复几次.请找出数 ...

  5. 剑指offer.01 数组中重复的数(0504刷题自用)

    代码 class Solution {public:int findRepeatNumber(vector<int>& nums) {unordered_map <int,i ...

  6. 《剑指offer》-- 把数组排成最小的数、丑数、二进制中1的个数、表示数值的字符串、替换空格

    一.把数组排成最小的数: 1.题目: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为 ...

  7. 【LeetCode】剑指 Offer 45. 把数组排成最小的数

    [LeetCode]剑指 Offer 45. 把数组排成最小的数 文章目录 [LeetCode]剑指 Offer 45. 把数组排成最小的数 package offer;import java.uti ...

  8. 剑指 Offer 笔记: T45. 把数组排成最小的数

    T45. 把数组排成最小的数 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个. 示例 1: 输入: [10,2] 输出: "102" ...

  9. 【剑指offer-Java版】33把数组排成最小的数

    把数组排成最小的数 难点在于比较规则的确定以及比较规则的正确性证明 比如:仅仅是局部的两个数字的顺序较小,如何保证整个数组按此规则进行排序后达到全局的较小 书中关于这一点的证明直接用的反证法,忘的差不 ...

最新文章

  1. python场景建立_Python创建一个街道地址表-问答-阿里云开发者社区-阿里云
  2. 技术图文:Python 匿名函数 VS. C# Lambda表达式
  3. Linux多线程之线程同步
  4. html:(10):添加空格和hr
  5. ecshop根目录调用_ECSHOP各文件夹功能说明
  6. 编程语言_如何正确地学习编程语言
  7. leetcode - 1025. 除数博弈
  8. 【软件项目管理】知识点整理
  9. 定时器name冲突会报错吗_部落冲突:冬季版本即将更新,多个超级兵种被曝光,会上线吗?...
  10. python isfile_基于Python中isfile函数和isdir函数使用详解
  11. 分布式存储系统学习笔记(一)—什么是分布式系统(1)—基本概念
  12. python爬虫实例100例-10个python爬虫入门实例
  13. 深入浅出SCSI子系统(八)SCSI错误恢复
  14. kafka集群搭建超详细教程
  15. 从苦逼走向牛逼:阿里云的苦难辉煌
  16. python爬取股票新闻
  17. 数据库系统概论实验二——创建及管理数据库
  18. 基于心理旋转的视线诱导设施优化及应用案例分析
  19. 按了锁定计算机怎么办,笔记本电脑键盘锁定了怎么办有什么方法解锁
  20. 30天自制操作系统学习-第8天

热门文章

  1. 停笔几天,休息一下也顺便思考一下人生
  2. tomcat 部署站点时遇到的部分问题以及解决方案
  3. ActiveReport的小数显示方法
  4. vs2008打开aspx设计界面无响应问题解决方法
  5. 什么是HTTP Headers?
  6. 【数据安全案例】车管信息再遭窃取,数据安全缺乏保障
  7. 在网页中怎样打印网页中的一部分(比如打印网页中的一个表格)
  8. 告诉我们您对 Office 2010 的看法
  9. Delphi中将DBGRID中的内容输出到WORD中
  10. 将集合中的内容按时间排序