lc279T2
简单题瓶颈 总感觉需要很复杂操作 但是有些需要学的
stol和stoll 字符串转换(stoi;stol;stoul;stoll;stoull;stof;stod;stold)
find if简易版 stl.find_if用法总结 两者区别 还可以
find()用于查找指定的元素,而find_if()用于搜寻使条件成立的第一个元素。
find()第三个参数是你指定的值,范围相对较小,
而find_if()第三个参数是个函数对象,可以指定找到符合条件的元素更大的范围
class Solution {
public:
long long smallestNumber(long long num) {
auto str=to_string(num);
if(str.front()=='-'||str.front()=='0'){
sort(str.begin()+1,str.end(),greater());
return stol(str);
}
sort(str.begin(),str.end());
swap(*find_if(str.begin(),str.end(),[](char c){return c!='0';}),*str.begin());
return stol(str);
}
};
class Solution {
public:
long long smallestNumber(long long num) {
if (num < 0) {
string s = to_string(-num);
sort(s.rbegin(), s.rend());
return -stoll(s);//stoll:字符串转long long
}
if (num == 0) return 0;
string s = to_string(num);
sort(s.begin(), s.end());
int i = 0;
while (s[i] == '0') i++;
char c = s[i];
s.erase(s.begin() + i);
s = c + s;//string和char做加法
return stoll(s);
}
};
这个也牛掰,分情况谈论写出函数
class Solution {
public:
long long smallestNumber(long long num) {
if (num > 0) { /* 正数处理 */
return calcPos(num);
}
return -calcNeg(-num); /* 小于等于0的处理 */
}
long calcPos(long long num) {
string s = to_string(num);
sort(s.begin(), s.end()); /* 从小到大排序 */
int idx = 0;
for (int i = 0; i < s.size(); i++) { /* 找到第一个非0元素 */
if (s[i] != '0') {
idx = i;
break;
}
}
swap(s[0], s[idx]); /* 第一个非0元素与第一个元素交换 */
return calcStr(s);
}
long calcNeg(long long num) {
string s = to_string(num);
sort(s.begin(), s.end(), greater<>()); /* 从大到小排序 */
return calcStr(s);
}
long calcStr(string s) { /* 计算字符串表示的数值大小 */
long ans = 0;
for (int i = 0; i < s.size(); i++) {
ans = ans * 10 + s[i] - '0';
}
return ans;
}
};
这个和我当初想法最相似 位数放进数组里
class Solution {
public:
long long smallestNumber(long long num) {
vector<int> a;
long long res = 0;
long long index = 1;
int l = -1;
if(num == 0) return 0;
while(num){
a.push_back(num % 10);
num /= 10;
}
sort(a.begin(), a.end());
bool isFlag = false;
if(a[0] == 0) isFlag = true;
if(isFlag){
for(int j = 1; j < a.size(); ++j){
if(a[j] != 0){
a[0] = a[j];
l = j;
break;
}
}
for(int i = l; i > 1; --i){
a[i] = a[i - 1];
}
a[1] = 0;
}
for(int i = a.size() - 1; i >= 0; --i){
res += a[i] * index;
index *= 10;
}
return res;
}
};
哈希记录数字出现次数的我不李姐
class Solution
{
public:
long long smallestNumber(long long num)
{
bool flag = num > 0;
if (num < 0)
{
num = -num;
}
string s = to_string(num);
int n = s.length();
int hash[10] = {0};
for (int i = 0; i < s.length(); i++)
{
hash[s[i] - '0']++;
}
long long res = 0;
int i;
if (flag)
{
for (i = 1; i < 10; i++)
{
if (hash[i] > 0)
{
res += i * pow(10, n - 1);
n--;
hash[i]--;
break;
}
}
while (hash[0] > 0)
{
n--;
hash[0]--;
}
for (i = 1; i < 10; i++)
{
while (hash[i] > 0)
{
res += i * pow(10, n - 1);
n--;
hash[i]--;
}
}
}
else {
for(i = 9; i >= 0; i--) {
while (hash[i] > 0)
{
res += i * pow(10, n - 1);
n--;
hash[i]--;
}
}
}
return flag? res: -res;
}
};