MarsCode--大数和距离【中等】
问题描述
有两个超大字符串数,问它们的和得到的字符串中的最大数和最小数之间相差多少位?如果都是一样的数则位数为 0,如果有多个数,则取符合条件的最小值。
输入格式
-
第一行是一个字符串数
-
第二行是一个字符串数
输出格式
- 最大数和最小数之间的位数
输入样例(1)
111
222
输出样例(1)
0
输入样例(2)
111
34
输出样例(2)
1
数据范围
- 两数都为非 0 的正整数
#include <iostream>
#include <string>
#include<algorithm>
#include<math.h>
#include<climits>
using namespace std;bool areAllSameDigits(const std::string& str) {// 检查字符串是否为空if (str.empty()) {return false; // 可以根据具体需求选择是否允许空字符串}char firstChar = str[0]; // 取第一个字符for (char ch : str) {if (ch != firstChar) {return false; // 只要有一个字符不同,就返回 false}}return true; // 所有字符都相同,返回 true
}long long fun(string s)
{//先把数字放入数组当中,找到最大值和最小值vector<int>v;vector<int>v1;//存放最小值的下标vector<int>v2;//存放最大值的下标vector<int>ans;if (areAllSameDigits(s))return 0;for (auto i : s){v.push_back(i + '0');}auto min = min_element(v.begin(), v.end());auto max = max_element(v.begin(), v.end());for (int i = 0;i < v.size();i++){if (v[i] == *min)v1.push_back(i);}for (int i = 0;i < v.size();i++){if (v[i] == *max)v2.push_back(i);}for (int i = 0;i < v1.size();i++){for (int j = 0;j < v2.size();j++){ans.push_back(abs(v1[i] - v2[j]) - 1);}}sort(ans.begin(), ans.end());return ans[0];
}long long solution(std::string a, std::string b) {// Please write your code here//首先进行二进制求和string result; // 返回的结果字符串int carry = 0;//进位int i = a.length() - 1; // 下标int j = b.length() - 1; // 下标while (i >= 0 || j >= 0 || carry != 0) {int sum = carry;if (i >= 0) {sum +=a[i--] - '0'; // 数字+字符‘0’[在计算机中以ASCII码存储]==字符}if (j >= 0) {sum += b[j--] - '0';}result.push_back(sum % 10+ '0'); // 缝2进一carry = sum / 10; // 如果sum是2就+1到下一位}reverse(result.begin(), result.end()); // 反转return fun(result);}int main() {// You can add more test cases herestd::cout << (solution("111", "222") == 0) << std::endl;std::cout << (solution("111", "34") == 1) << std::endl;std::cout << (solution("5976762424003073", "6301027308640389") == 6) << std::endl;return 0;
}
