字符串中连续最长数字串
这道题目比较简单,先用两个字符串str1,str2存放数字串,快慢指针找到字符串,存放到str2里,如果str2的长度大于str1,就更新str1
示例代码:
#include <iostream>
#include <string>
using namespace std;
int main(){
string str, str1, str2;
cin >> str;
for (int i = 0; i < str.size(); ++i){
if (str[i] >= '0' && str[i] <= '9')
str2 += str[i];
else{
//更新str1
if (str1.size() < str2.size())
str1 = str2;
//清除str2
str2.clear();
}
}
cout << str1 << endl;
return 0;
}
数组中超过一半的数字
对于这道题目,如果我们对数组排序,因为有解,所以中间的数字一定就是出现次数超过一半的数字。
但这样的时间复杂度为O(Nlog(N))。
比较简单,示例代码就不必写。
如果想要提升效率,就有点难度。
我们要找的是出现次数超过一半的数字,那如果把每两个邻近的不相同的数字消去,相同的留下,遍历一遍,留下的肯定是我们要求的数字(假设2n+1个数字匹配n次),因为所有的匹配不可能数字都不一样,如果都不一样,那就没有出现次数超过一半的数字了。
那我们如何实现这个方法呢?
设要找的数字为众数,先假设第一个数是众数,并设一个计数器 = 1,如果下一个数字与中枢相同,计数器加一,如果不同,计数器减一,当计数器为0,假设此时的下一个数为众数,这样就达到了消去的效果,遍历一遍之后的众数,就是我们要找的数字,此时计数器一定不为0。
示例代码:
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
if (numbers.empty())
return 0;
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;
}
};