首页 > 技术文章 > 中兴2018届应届生在线编程测验 数字的最小排列

Stephen-Qin 2017-08-25 21:45 原文

题目:根据给定的"锁定密码"(一串数字),可以计算出"解锁秘钥",它是该数中数字的最小排列(数量上),且它不会从零开始.

输入:一串数字lockingKey,约束-100000<= lockingKey <= 100000

输出:返回一个表示解锁的整数

 

实例:

输入:

lockingKey = 706;

输出:

607

 

函数形式

  long findUnlock(long lock)

  {

  }

 

思路分析:

 题中表述的是数字的最小排列问题,且第一位不能为0.可以先把这些数字存到vector中,然后从小到大排列,排列完如果第一位是0的话,把第一个非0的数字和第一位交换.这样就基本实现了.

 

 参考程序:


#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;

long findUnlock(long lock)
{
    if (lock < 0)
    {
        lock = -lock;
    }
    string str;
    str = to_string(lock);    //倘若是VS2010下,要求to_string的参数为long long 类型,要改成long long(lock)   //转化为string类型,方便处理.
    vector<int> ivec;
    int val;
    for (int i = 0; i < str.size(); i++)
    {
        val = str[i] - '0';  //这是一个技巧,把数字字符改为真正的数字
        ivec.push_back(val);
    }
    sort(ivec.begin(), ivec.end());
    int j;
    if (ivec[0] == 0)
    {
        for (int i = 0; i < ivec.size(); i++)
        {
            if (ivec[i] != 0)
            {
                j = i;
                break;
            }
        }
        swap(ivec[0], ivec[j]);  ///若第一位为0,把第一个非0的数字和第一位交换.注意放在if里面.要拿非特殊也验证下
    }
    long s = 0;
    for (int i = 0; i < ivec.size(); i++)
    {
        s += pow(10, ivec.size() - i - 1)*ivec[i];    //倘若是VS2010下,pow不能两个都是int,有pow(double,int)的用法,要改成pow(10.0,...)
    }
    return s;
}

int main()
{
    cout << findUnlock(-83047) << endl;
    return 0;
}

 

 

 

推荐阅读