题目:根据给定的"锁定密码"(一串数字),可以计算出"解锁秘钥",它是该数中数字的最小排列(数量上),且它不会从零开始.
输入:一串数字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;
}