最长公共前缀
C++答案:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (!strs.size()) {
return "";
}
string prefix = strs[0]; //提取出第一个字符串
int count = strs.size(); //获取字符串数量
for (int i = 1; i < count; ++i) { //从第二个字符串开始遍历每个字符串
prefix = longestCommonPrefix(prefix, strs[i]); //提取两个字符串的最长公共前缀
if (!prefix.size()) { //如果最长公共前缀的长度是0,那么直接跳出
break;
}
}
return prefix;
}
string longestCommonPrefix(const string& str1, const string& str2) {
int length = min(str1.size(), str2.size()); //获得两个字符串之中较小的长度
int index = 0;
while (index < length && str1[index] == str2[index]) {
++index;
}
return str1.substr(0, index); //获得从0到index的子串
}
};
整数反转:
此题有待深入学习,min和max都除以10这个判断标准并没还有很好地理解
C++答案:
class Solution {
public:
int reverse(int x) {
int rev = 0;
while (x != 0) {
if (rev < INT_MIN / 10 || rev > INT_MAX / 10) { //小于最小或者大于最大都是越界情况
return 0;
}
int digit = x % 10;
x /= 10;
rev = rev * 10 + digit;
}
return rev;
}
};
罗马数字转整数:
class Solution {
private:
unordered_map<char, int> symbolValues = { //这个容器操作还需要学习才行
{'I', 1},
{'V', 5},
{'X', 10},
{'L', 50},
{'C', 100},
{'D', 500},
{'M', 1000},
};
public:
int romanToInt(string s) {
int ans = 0;
int n = s.length();
for (int i = 0; i < n; ++i) {
int value = symbolValues[s[i]]; //取出s每个位置上对应的数值,
if (i < n - 1 && value < symbolValues[s[i + 1]]) { //判断是加还是减,先要小于最后一位并且数值小于s[i]的下一位,那么这个数就是被减去的
ans -= value;
} else {
ans += value;
}
}
return ans;
}
};