leetcode array

来源:互联网 发布:生物制药就业前景知乎 编辑:程序博客网 时间:2024/06/06 01:08
  1. Maximum Swap
    题目
    题目大意就是最多交换一次使数字最大。
    本来以为只要找出最大值,然后和首位交换即可,但是忘记考虑如果首位是最大就要考虑第二大和第二位交换..第三大第四大等等,最后想干脆直接排个序得了,这样不用每次循环遍历找大的,但是其实这个题目最大只有8位,循环遍历找最大的时间比直接排好序直接取的时间要短。另发现可以直接用to_string(num)就把num转成string可以直接操作了,而不用vector一位位取。在此附上自己本来的方法,及看别人代码学习的方法。

原始的,6ms

class Solution {public:    int maximumSwap(int num) {        int nnum=num;        vector<int> vnum;        vector<int> snum;        int i=0;        while(num)        {            vnum.push_back(num%10);            snum.push_back(num%10);            num/=10;            i++;        }        sort(vnum.begin(),vnum.end());        cout<<vnum[i-1];        i=vnum.size();        while(snum[i-1]==vnum[i-1]&&i>0)        {            i--;        }        if(i==0)            return nnum;        if(snum[i-1]!=vnum[i-1])        {            for(int j=0;j<i-1;j++)                if(snum[j]==vnum[i-1])                {                    snum[j]=snum[i-1];                    snum[i-1]=vnum[i-1];                 }        }        num=0;        for(int j=snum.size()-1;j>=0;j--)        {            num=num*10+snum[j];        }        return num;    }};

别人的,3ms

int maximumSwap(int num) {    string numString = to_string(num);    int n = numString.length();    vector<int> dpPosition(n, -1);    int curMaxPos = n - 1;    for (int i = n - 1; i >= 0; i--) {        if (numString[i] > numString[curMaxPos]) {            curMaxPos = i;        }        dpPosition[i] = curMaxPos;    }    for (int i = 0; i < n; i++) {        if(numString[dpPosition[i]] != numString[i]) {            swap(numString[i], numString[dpPosition[i]]);            break;        }    }    return stoi(numString);}

学习后写的 3ms

class Solution {public:    int maximumSwap(int num) {       string snum=to_string(num);       int size=snum.length();       int j=0;       int max=0;     for(int j=0;j<size-1;j++)     {         max=j;         for(int i=j+1;i<size;i++)       {           if(snum[i]>=snum[max])               max=i;       }             if(max!=j&&snum[max]!=snum[j])         {            swap(snum[max],snum[j]);            break;         }     }          return stoi(snum);    }};

这种方法开始在 if(snum[i]>=snum[max]) 只是>时就提交错误,1993 我输出的就是9193 而正确答案应该是9913。这里的问题是找最大值找到第一个就停了,其实应该找靠后的最大值,忽略了有值相同的情况。这个以后也要注意
第一种方法没这个问题是因为找最大是倒着找的,正好找到了靠后的最大值,而不是自己考虑到了,这个注意。