剑指offer自学系列(四)
题目描述:
输入一个正整数数组,把数组里面所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个,例如输入数组{3,32,321},输出的最小数字为321323
题目分析:
如果采用穷举法,把每一种可能都列举一遍,然后比较得到最小的一个字符串,那么将会有n的全排列个组合,也就是n的阶乘种情况,当n值很大时,时间复杂度是爆炸的,所以我们需要采用一种更小的方法,首先我们知道这样一个规律,对于字符串连接(+表示连接),如果A+B<B+A,则A<B,如果A+B>B+A,则A>B,如果A+B=B+A,则A=B,所以排序的时候按照从小到大的顺序,最后依次连接得到的值最小,下面按照这个思路得到代码:
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std; bool cmp(int a, int b) {
string strA = to_string(a) + to_string(b);
string strB = to_string(b) + to_string(a);
return strA < strB;
} string MinNumber(vector<int>matrix) {
int length = matrix.size();
if (length == 0) { return “”; }
sort(matrix.begin(), matrix.end(), cmp);
string res;
for (int i = 0; i < length;i++) {
res += to_string(matrix[i]);
}
return res;
} int main() {
vector<int> num = {23,1,456};
string result = MinNumber(num);
cout << result << endl;
}
题目描述:
请实现一个函数,将一个字符串中所有的空格替换成“%20”,例如,将字符串“We Are Happy”替换成“We%20Are%20Happy”
题目分析:
我们依然先考虑从头到尾找到一个空格就插入”%20”这样一组符号,假如找到一个空格,我们会想将后面的值往后移两格,但是数组必然初始空间得设很大,如果采用向量,则需要扩容,如果我们首先通过一轮循环找到有多少个空格,然后计算需要用多大的空间也是可行的,比如有两个空格,那么我们就设比初值长度大4的空间,我们采用双指针控制,由于中间的值如果空格替换后会往后移,所以我们让指针从后往前检索
#include<iostream>
using namespace std; char *SpaceToStr(char a[], int start,int len){
int i = len;
int j = start;
while (j>=0) {
if (a[j]!=' ') {
a[i] = a[j];
i--;
j--;
}
else {
a[i] = '0';
a[i - 1] = '2';
a[i - 2] = '%';
i = i - 3;
j--;
}
}
return a;
} int main() {
char a[] = { "We Are Happy" };
int i = 0;
int count = 0;
while (a[i]!='\0') {
if (a[i] == ' ')
count += 1;
i++;
}
cout << i << endl;
char *b;
b = SpaceToStr(a, i, i+2*count);
cout << b << endl;
return 0;
}
剑指offer自学系列(四)的更多相关文章
- 剑指offer自学系列(三)
题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变,例如{5,1,4,2 ...
- 剑指offer自学系列(二)
题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内,数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次,请找出数组中任一个重复的数字,例如,如果输入长度为7的 ...
- 剑指offer自学系列(五)
题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...
- 剑指offer自学系列(一)
题目描述:输入n个整数,找出其中最小的k个数,例如,输入{4,5,1,6,2,7,3,8}这8个数字,最小的4个数字是1,2,3,4 题目分析:首先我能想到的是先对数组排序,从小到大,然后直接输出想要 ...
- 剑指offer题目系列三(链表相关题目)
本篇延续上一篇剑指offer题目系列二,介绍<剑指offer>第二版中的四个题目:O(1)时间内删除链表结点.链表中倒数第k个结点.反转链表.合并两个排序的链表.同样,这些题目并非严格按照 ...
- 剑指offer题目系列二
本篇延续上一篇,介绍<剑指offer>第二版中的四个题目:从尾到头打印链表.用两个栈实现队列.旋转数组的最小数字.二进制中1的个数. 5.从尾到头打印链表 题目:输入一个链表的头结点,从尾 ...
- 剑指offer题目系列一
本篇介绍<剑指offer>第二版中的四个题目:找出数组中重复的数字.二维数组中的查找.替换字符串中的空格.计算斐波那契数列第n项. 这些题目并非严格按照书中的顺序展示的,而是按自己学习的顺 ...
- 《剑指offer》第四十七题(礼物的最大价值)
// 面试题47:礼物的最大价值 // 题目:在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值 // (价值大于0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向左或 // 者向下 ...
- 《剑指offer》第四十五题(把数组排成最小的数)
// 面试题45:把数组排成最小的数 // 题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼 // 接出的所有数字中最小的一个.例如输入数组{3, 32, 321},则打印出这3 ...
随机推荐
- input文本框自适应文本内容宽度
input文本框自适应文本内容宽度 <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- RIFF
RIFF全称为资源互换文件格式(Resources Interchange File Format),是Windows下大部分多媒体文件遵循的一种文件结构. RIFF文件所包含的数据类型由该文件的扩展 ...
- 9.2.3 hadoop reduce端连接-分区分组聚合
1.1.1 reduce端连接-分区分组聚合 reduce端连接则是利用了reduce的分区功能将stationid相同的分到同一个分区,在利用reduce的分组聚合功能,将同一个st ...
- MyBatis插入时获取自增长主键
在某些场景下,我们需要使用mybatis返回生成的主键值.Mybatis在insert和update标签中就提供了这种功能. 方法1: <insert id=”indetifyId” useGe ...
- 敌兵布阵-HDU1166 点修改+区间查询
题目:C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况 ...
- UniCode 速查表
unicode速查表 0000–0FFF 1000–1FFF 2000–2FFF 3000–3FFF 4000–4FFF 5000–5FFF 6000–6FFF 7000–7FFF 8000–8FFF ...
- linux修改键盘按键
我的电脑:Fedora-19 $ uname -a Linux localhost.localdomain 3.11.10-200.fc19.i686 #1 SMP Mon Dec 2 20:48:2 ...
- Mybatis-问题总结
1.在mybatis里面注释语句的时候,一定用 <!- -需要注释的内容–>.用快捷键注释一行代码显示是/**/,但是实际执行起来报错.
- struts2--action请求与Action类
1.action:代表一个sturts2的请求: 2.Action类:能够处理Struts2请求的类: --属性名必须遵守与JavaBean属性名相同的命名规则: --属性的类型可以使任意类型.从字符 ...
- 刷题20. Valid Parentheses
一.题目说明 这个题目是20. Valid Parentheses,简单来说就是括号匹配.在学数据结构的时候,用栈可以解决.题目难度是Medium. 二.我的解答 栈涉及的内容不多,push.pop. ...