读入一个字符串str,输出字符串str中的连续最长的数字串
输入描述
个测试输入包含1个测试用例,一个字符串str,长度不超过255。
输出描述
在一行内输出str中里连续最长的数字串。
示例 1
输入
abcd12345ed125ss123456789
输出
123456789
思路1:
int main() {
string s, longfig, temp; // longfig用来保存最长数字字符串
getline(cin, s);
for (int i = 0; i < s.size(); i++) // 遍历输入的字符串
{
while (s[i] - '0' >= 0 && s[i] - '0' <= 9) // 如果为数字,保存到temp
{
temp += s[i];
i++;
}
if (temp.size() > longfig.size()) // 如果temp比longfig长,则把temp赋值给longfig
longfig = temp;
temp = "";
}
cout << longfig;
return 0;
}
给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
数据范围:,数组中元素的值
要求:空间复杂度:,时间复杂度
示例 1
输入
[1,2,3,2,2,2,5,4,2]
输出
2
示例 2
输入
[3,3,3,3,2,2,2]
输出
3
示例 3
输入
[1]
输出
1
思路1:
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int>& numbers) {
sort(numbers.begin(), numbers.end());
return numbers[numbers.size() / 2];
}
};
思路2:
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
unordered_map<int,int> mp;
for (const int val : numbers) ++mp[val];
for (const int val : numbers) {
if (mp[val] > numbers.size() / 2 ) return val;
}
return 0;
}
};
思路3:(最优解)时间和空间复杂度:O(n),O(1)
如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,最后留下的数肯定是众数
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
int cond = -1;
int cnt = 0;
for (int i=0; i<numbers.size(); ++i) {
if (cnt == 0) {
cond = numbers[i];
++cnt;
}
else {
if (cond == numbers[i]) ++cnt;
else --cnt;
}
}
cnt = 0;
for (const int k :numbers) {
if (cond == k) ++cnt;
}
if (cnt > numbers.size() / 2) return cond;
return 0;
}
};
A,B,C三个人是好朋友,每个人手里都有一些糖果,我们不知道他们每个人手上具体有多少个糖果,但是我们知道以下的信息:
A - B, B - C, A + B, B + C. 这四个数值.每个字母代表每个人所拥有的糖果数.
现在需要通过这四个数值计算出每个人手里有多少个糖果,即A,B,C。这里保证最多只有一组整数A,B,C满足所有题设条件。
输入描述
输入为一行,一共4个整数,分别为A - B,B - C,A + B,B + C,用空格隔开。 范围均在-30到30之间(闭区间)。
输出描述
输出为一行,如果存在满足的整数A,B,C则按顺序输出A,B,C,用空格隔开,行末无空格。 如果不存在这样的整数A,B,C,则输出No
示例 1
输入
1 -2 3 4
输出
2 1 3
思路1:
int main() {
vector<int> v;
int a, b, c;
v.resize(4);
for (int i = 0; i < 4; i++)
cin >> v[i];
a = (v[0] + v[2]) / 2;
b = (v[1] + v[3]) / 2;
c = b - v[1];
if (a-b == v[0] && b-c == v[1] && a+b == v[2] && b+c == v[3])
cout << a << " " << b << " " << c;
else cout << "No";
return 0;
}
给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数
输入描述
输入为一行,M(32位整数)、N(2 ≤ N ≤ 16),以空格隔开。
输出描述
为每个测试实例输出转换后的数,每个输出占一行。如果N大于9,则对应的数字规则参考16进制(比如,10用A表示,等等)
示例 1
输入
7 2
输出
111
思路1:
本题需要注意的是十进制数可能为0
和负数的情况,需要特殊处理
void TenScaleConvertOther(int M, int N, string& s) // 十进制转其他进制函数
{
char figure[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
while (M) {
s.push_back(figure[M % N]);
M = M / N;
}
}
int main() {
int M, N;
cin >> M >> N;
string s;
if (M == 0) // 需要考虑M为0的情况
s.push_back('0');
TenScaleConvertOther(abs(M), N, s); // M可能为负数, 传绝对值过去
reverse(s.begin(), s.end());
if (M < 0)
cout << '-' << s;
else cout << s;
return 0;
}