话不多说,首先上我的粗暴做法:
int secondHighest(string s) {
set<int>S;
vector<int>T;
for (int i = 0; i < s.length(); i++)
{
if ((s[i]>='0')&&(s[i]<='9'))
{
int k=s[i]-'0';
S.insert(k);
}
}
for (auto i = S.begin(); i != S.end(); i++)
{
T.push_back(*i);
}
if ((T.size()==1)||(T.size()==0))
{
return -1;
}
for (int i = 0; i < T.size(); i++)
{
for (int j = i+1; j < T.size(); j++)
{
if (T[j]>T[i])
{
swap(T[i],T[j]);
}
}
}
return T[1];
}
评定结果为:
可以说明,我的做法看到不是最好的,繁琐且容易出问题,我们看看官方的做法:
class Solution {
public:
int secondHighest(string s) {
int first = -1, second = -1;
for (auto c : s) {
if (isdigit(c)) {
int num = c - '0';
if (num > first) {
second = first;
first = num;
} else if (num < first && num > second) {
second = num;
}
}
}
return second;
}
};
官方的做法让我学到了以下东西:
①遍历字符串不用再用传统的方法,可以用for(auto c : s)来遍历;
②判断字符是否为数字字符可以直接用isdigit()方法,不用再去比较ASCII码;
③官方的思路简洁,很有代表性。