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