剑指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}的一个旋转 ...
随机推荐
- SpringBoot与Shiro整合
一.数据库设计 这里主要涉及到五张表:用户表,角色表(用户所拥有的角色),权限表(角色所涉及到的权限),用户-角色表(用户和角色是多对多的),角色-权限表(角色和权限是多对多的).表结构建立的sq ...
- PyQt5中Web操作与多线程定时器
1.装载外部网页页面'''用web浏览器控件QWebEngineView控件显示网页PyQt5和Web的交互技术 同时使用python和Web开发程序,混合开发 Python+JavaScript+H ...
- 思科交换机配置单播MAC地址过滤
1.其他厂商: 在华为,华三等设备上,我们都有“黑洞MAC地址表项” 的配置,其特点是手动配置.不会老化,且重启后也不会丢失.例如如下示例: 黑洞表项是特殊的静态MAC地址表项,丢弃含有特定源MAC地 ...
- C++判断txt文件编码格式
转载:https://blog.csdn.net/kikityan/article/details/89923808 记事本打开txt文件,然后另存,有四种编码格式可供选择,分别是:ANSI ...
- SQL SERVER用户表信息
可以使用下面这个语句查看用户表的相关信息 RowCount 记录数 FileGroup 文件组 PartitionScheme 分区结构 IsPartitioned 是否分区 SELECT tbl.n ...
- slice 、 substr 、replace
slice( 参数1 [,参数2] ) (注意不要让[参数1]下标越过[参数2]下标,否则会得到空字符串,且[参数2]是不包含在截取范围内的) 参数1:截取字符的[起始下标]. 值为正 ...
- Java入门笔记 00-前言&目录
前言:这本笔记记录的是Java基础部分的学习内容,大部分内容总结性的,包括: ---01 Java基础语法 ---02 数组 ---03 面向对象 ---04 异常处理 ---05 多线程 ---06 ...
- js数组去重解决方案
js数组去重是前端面试中经常被问的题目,考察了面试者对js的掌握,解决问题的思路,以及是否具有专研精神.曾经一位前端界大神告诉我,解决问题的方式有很多种,解决问题时多问问自己还有没有其他的方法,探求最 ...
- 吴裕雄--天生自然PythonDjangoWeb企业开发:学员管理系统- 前台
开发首页 做一个简单的用户提交申请的表单页面. 首先在student/views.py文件中编写下面的代码: # -*- coding: utf-8 -*- from __future__ impor ...
- LinkedHashMap的用法
1:LinkedHashMap的简介 Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序.此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表.此链接列表定义了迭 ...