剑指offer 把数组排成最小的数 atoi和itoa,pow
pow(x,y)在#include<math.h>文件中,计算x的y次方。
C++引入头文件:#include <stdlib.h> 或者 #include <cstdlib>
1、整数转化为字符串的方法:
1.1 atoi原型:注意:参数若为string类型一定转换成char*型(str.c_str())
- #include <stilib.h>或者#include<cstdlib>
- int atoi(const char *str);
atoi作用:把str字符串转换成整型数。如果第一个非空格字符不存在或者不是数字也不是正负号则返回零,否则开始做类型转换,之后检测到非数字或结束符 \0 时停止转换,返回整型数。
itoa原型:
- #include<cstdlib>或者#include<stdlib.h>
- char *str[20];
- 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[];
sprintf(buf, "%d", );
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 = ; i < numbers.size(); ++i) {
if (i != && numbers[i] == numbers[i - ] && visited[i - ] == || visited[i] == ) {
continue;
}
visited[i] = ;
tmp.push_back(numbers[i]);
helper(numbers, visited, result, tmp);
tmp.pop_back();
visited[i] = ;
}
}
int permutation(vector<int>& numbers) {
vector<vector<int>> result;
int minNum = INT_MAX;
vector<int> Tmp;
if (numbers.size() == ) {
return ;
}
vector<int> visited(numbers.size(), );
helper(numbers, visited, result, Tmp);
unordered_map<int, int> hashMap;
for (int n : numbers) {
int countPos = ;
int n1 = n;
while (n != ) {
n = n / ;
++countPos;
}
cout << "countPos " << countPos << " " << n1 << " ";
hashMap.insert(make_pair(n1,countPos)); } for (vector<int> tmp : result) {//将数组转化为整数
int num = ;
int countP = ;
for (int i = ; i < tmp.size(); ++i) {
//cout << tmp[i] << " ";
if (i == ) {
num = tmp[i];
}
else {
cout << "///" << hashMap[tmp[i - ]];
countP += hashMap[tmp[i - ]];
num += tmp[i] * (pow(, 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{ ,, };
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() == ){
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;
}
};
上面的方法需要证明:
组合数学里面的自反性,对称性,传递性。
剑指offer 把数组排成最小的数 atoi和itoa,pow的更多相关文章
- [剑指Offer]45-把数组排成最小的数
题目链接 https://www.nowcoder.com/practice/8fecd3f8ba334add803bf2a06af1b993?tpId=13&tqId=11185&t ...
- 剑指Offer——把数组排成最小的数
题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 分析: 排 ...
- 用js刷剑指offer(把数组排成最小的数)
题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 思路 对ve ...
- leetcode 179. Largest Number 、剑指offer33 把数组排成最小的数
这两个题几乎是一样的,只是leetcode的题是排成最大的数,剑指的题是排成最小的 179. Largest Number a.需要将数组的数转换成字符串,然后再根据大小排序,这里使用to_strin ...
- 剑指offer--32.把数组排成最小的数
用to_string()将整形转化为字符串,对字符串进行比较 --------------------------------------------------------------------- ...
- 剑指Offer-39.把数组排成最小的数(C++/Java)
题目: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 分析: 将数组 ...
- 4-剑指offer: 把数组排成最小的数
题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 代码: cl ...
- 剑指Offer31 把数组排成最小的数
/************************************************************************* > File Name: 31_SortAr ...
- 剑指Offer 旋转数组的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...
随机推荐
- Hibernate学习(二)
持久化对象的声明周期 1.Hibernate管理的持久化对象(PO persistence object )的生命周期有四种状态,分别是transient.persistent.detached和re ...
- 2018 最新注册码【激活码】、在线激活 pycharm 完整方法(亲测有效)【2018.06.01 重大更新!!!!】
2018-06-01修改如下: 原来方法的第二种还是有效的,操作如下 (1)更新hosts文件(可以直接下载,然后解压缩) host文件地址 hosts文件,在windows中的地址为: 替换host ...
- 「JSOI2010」旅行
「JSOI2010」旅行 传送门 比较妙的一道 \(\text{DP}\) 题,思维瓶颈应该就是如何确定状态. 首先将边按边权排序. 如果我们用 \(01\) 串来表示 \(m\) 条边是否在路径上, ...
- idea选择主题
主题下载地址1:http://color-themes.com/?view=index 主题下载地址2:http://www.themesmap.com/ 主题下载地址3:http://www.ria ...
- Django 学习之Django Rest Framework(DRF)
一. WEB应用模式 在开发Web应用中,有两种应用模式 1. 前后端不分离 把html模板文件和django的模板语法结合渲染完成以后才从服务器返回给客户. 2. 前后端分离 二. API接口 AP ...
- 10 从DFS到DFT
从DFS到DFT 周期序列的级数展开 正如连续时间周期信号可以表示为一系列正弦信号的和的形式,周期序列也可以表示为一系列正弦之和的形式,假设序列\(\tilde{x}[n]\)的周期为\(N\),那 ...
- 1146. Snapshot Array
Implement a SnapshotArray that supports the following interface: SnapshotArray(int length) initializ ...
- 金币(0)<P2015_1>
金币 (coin.cpp/c/pas) [问题描述] 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天),每天收到两枚金币:之后三天(第四.五.六天),每天收 ...
- Codeforces Round #617 (Div. 3)A. Array with Odd Sum(水题)
You are given an array aa consisting of nn integers. In one move, you can choose two indices 1≤i,j≤n ...
- 夯实Java基础(二十)——JAVA正则表达式
1.为什么要用正则表达式 首先我们先来做一道题目:判断一个字符串是否由数字组成.代码示例如下: public class Test { public static void main(String[] ...