剑指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}的一个旋转 ...
随机推荐
- idea开发web项目${pageContext.request.contextPath}无法转义
web-app版本问题,我的web.xml中头文件的配置是: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web ...
- 快速创建vue 项目
随着VUE 技术的不断更新,越来越多的开发者开始使用vue编写前端界面,今天我就和大家分享一下 ,如何快速创建一个vue项目. 前提: 安装了node.js 首先: 全局安装vue-cli 使用命令: ...
- 吴裕雄--天生自然Numpy库学习笔记:NumPy 数学函数
NumPy 包含大量的各种数学运算的函数,包括三角函数,算术运算的函数,复数处理函数等. NumPy 提供了标准的三角函数:sin().cos().tan(). import numpy as np ...
- 影响IPSec的网络问题
影响IPSec VPN的网络问题:①.动态地址问题:两个 站点之间IPSec VPN的条件是站点之间有固定的IP地址,假如说分支站点采用ADSL上网链路,那么其IP地址是动态的,那么就在VPN时出现问 ...
- 洛谷P1073最优贸易(跑两遍dij)
题目描述 CC C国有n n n个大城市和m mm 条道路,每条道路连接这 nnn个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 mmm 条道路中有一部分为单向通行的道路,一部分为 ...
- 「Luogu P5368 [PKUSC2018]真实排名」
PKUSC签到题 题目大意 给出一个长度为 \(N\) 的序列,序列中有 \(K\) 个数会乘二,对于每个数计算在乘二后大于等于这个数的个数与乘二前没有发生变化的方案数. 分析 思路很清晰,可以将答案 ...
- ssh paramiko && subprocess
subprocess: #!/usr/bin/python3 import paramiko import os import sys import subprocess curPath = os.p ...
- rc
1,协同过滤. 2,协方差:用来衡量,他们的变化趋势是不是一致的. 3,皮尔逊相关系数:-1,负相关.1:正相关. 4,用皮尔逊相关系数来算相关性是最多的.
- C++中的四种类型转换运算符static_cast、dynamic_cast、const_cast和reinterpret_cast的使用
1.上一遍讲述了C语言的隐式类型转换和显示类型转换,C语言之所以增加强制类型转换,就是为了强调转换的风险性,但这种强调风险的方式是比较粗放了,粒度比较大,它并没有表明存在什么风险,风险程度如何. 2. ...
- Simple English
Simple English 1. Basic English 1.1 设计原则: 1.2 基本英语单词列表850个 1.3 规则: 1.4 质疑 1.5 维基百科:基本英语组合词表 1.6 简单英文 ...