• 剑指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]!='') {
            if (a[i] == ' ')
                count += 1;
            i++;
        }
        cout << i << endl;
        char *b;
        b = SpaceToStr(a, i, i+2*count);
        cout << b << endl;
        return 0;
    }
  • 相关阅读:
    慎用rm -rf
    Jquery 中a||""的含义
    【学习、总结】Spring security 登陆超时处理
    Eclipse 无限编译Invoking 'Maven Project Builder'导致卡主
    For多重循环 break continue
    随机编码的生成
    QQ互联Oauth2.0认证测试
    Java开发工程师(Web方向)
    Java开发工程师(Web方向)
    前端开发工程师
  • 原文地址:https://www.cnblogs.com/51selfstudy/p/10679860.html
Copyright © 2020-2023  润新知