剑指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;
}
posted @ 2019-04-09 21:22  薛定谔的哈士奇  阅读(113)  评论(0编辑  收藏  举报