Just looking at the code, the answer would be simple. The function should return an std::string and you return and int. You could be tempted now to solve the issue by using the to_string function and convert the int to a std:string.
But, this will not work.
The solution should and must work with strings.
Constraints:
1 <= k <= nums.length <= 104
1 <= nums[i].length <= 100
nums[i] consists of only digits.
nums[i] will not have any leading zeros.
It is obvious that you cannot store 100 digits long numbers in an int. So, you must also use sorting with strings.
But this will make life difficult, because you then need to employ so called natural sorting.
Example: Looking a 2,3 and 200, then, if you compare string, 3 will be greater than 200. And that is what the guys want from you. Natural sorting.
There are many solutions possible. Here is one of them:
#include <iostream>
#include <string>
#include <cctype>
#include <algorithm>
#include <vector>
using namespace std::string_literals;
// FUNCTOR for Natural sort function. Limited to signed char strings
struct NaturalSort {
bool operator ()(const std::string& s1, const std::string& s2) {
// We want to iterate over both strings
const char* i1 = s1.data(); // Get a pointer to the beginning of string 1
const char* i2 = s2.data(); // Get a pointer to the beginning of string 2
// Result of comparison. 0 means equal, positive means s1>s2, negative means s1<s2
int result = 0;
// As long as both characters/numbers are equal and there are still characters in the string
do {
// If we found a digit at the same position in both strings
if (std::isdigit(*i1) and std::isdigit(*i2)) {
std::size_t pos1{}, pos2{}; // This will later indicate how many digits we read
// Convert the strings to numbers and compare them
result = std::stoi(i1, &pos1) - std::stoi(i2, &pos2);
// Set pointers to the position after the number
i1 += pos1; i2 += pos2;
}
else {
// Normal character
result = (*i1 - *i2);
++i1; ++i2;
}
} while ((result == 0) and (*i1 != 0 or *i2 != 0));
// Let's limit the output to -1, 0 ,1
return result < 0;
}
};
class Solution{
public:
std::string kthLargestNumber(std::vector<std::string>& nums, int k) {
std::sort(nums.begin(), nums.end(), NaturalSort());
return nums[nums.size()-k];
}
};
// Driver / test code
int main() {
std::vector<std::string> test{ "2"s,"3"s,"20"s,"30"s,"200"s,"300"s };
Solution solution{};
for (int k = 1; k <= test.size(); ++k)
std::cout << "With k=" << k << " the result would be: " << solution.kthLargestNumber(test, k) << '\n';
}