1つ、複数の選択肢
eg1
eg2
eg3
eg4
eg5
2.プログラミングの質問
eg1
[解決策のアイデア]:
文字列をトラバースし、curを使用して連続番号文字列を記録します。数字以外の文字が見つかった場合は、連続番号文字列が終了したことを意味します。次に、番号文字列を前の番号文字列と比較します。 longの場合は、長い数値文字列をretに更新します。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
cin >> s;
string cur;
string ret;
//<= s.size();防止出现abcd12345ed125ss123456789
for(int i = 0; i <=s.size(); ++i)
{
//如果是数字字符就插入cur
if('0' <= s[i] && s[i] <= '9')
{
cur += s[i];
}
else
{
//判断cur的长度是否大于ret的长度
if(cur.size() > ret.size())
{
ret = cur;
}
//清空cur
cur.clear();
}
}
cout << ret << endl;
return 0;
}
eg2
[問題解決のアイデア1]:
アイデア1:配列を並べ替えた後、条件を満たす番号が存在する場合は、配列の中央にある番号である必要があります。この方法は理解しやすいですが、O(NlogN)の時間計算量は、クイックソートが含まれるため最適ではありません。
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers)
{
sort(numbers.begin(), numbers.end());
int index = numbers.size() / 2;
return numbers[index];
}
};
[問題解決のアイデア2]:モード:
配列の半分以上の長さで表示される数値。2つの数値が等しくない場合は、2つの数値を削除します。最悪の場合、1つのモードと1つの非モードを削除します。時間。、そしてモードがある場合、最後に残っている数字はモードでなければなりません
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers)
{
int result = numbers[0];
int times = 1;
for(int i = 1; i < numbers.size(); ++i)
{
if(times != 0)
{
if(result == numbers[i])
{
++times;
}
else
{
--times;
}
}
else
{
result = numbers[i];
times = 1;
}
}
return result;
}
};