1. 字符串中找出连续最长的数字串
读入一个字符串str,输出字符串str中的连续最长的数字串
输入描述
个测试输入包含1个测试用例,一个字符串str,长度不超过255。
输出描述
在一行内输出str中里连续最长的数字串。
示例 1
输入
abcd12345ed125ss123456789
输出
123456789
思路1:
- 定义两个string,longfig和temp
- temp获取数字字符串,longfig保留最长数字字符串
如果temp比longfig长,把temp赋值给longfig,temp置空
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赋值给longfiglongfig = temp;temp = "";}cout << longfig;return 0;
}
2. 数组中出现次数超过一半的数字
给一个长度为 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:
- 遍历一遍数组
- 在map中存每个元素出现的次数
然后再遍历一次数组,找出众数
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)
如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,最后留下的数肯定是众数
- 初始化:候选人cond = -1, 候选人的投票次数cnt = 0
- 遍历数组,如果cnt=0, 表示没有候选人,则选取当前数为候选人,++cnt
- 否则,如果cnt > 0, 表示有候选人,如果当前数=cond,则++cnt,否则–cnt
- 直到数组遍历完毕,最后检查cond是否为众数
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;}
};
3. 计算糖果
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:
- (整数1 + 整数3) / 2 = A
- (整数2 + 整数4) / 2 = B
- B - 整数2 = C
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;
}
4. 进制转换
给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数
输入描述
输入为一行,M(32位整数)、N(2 ≤ N ≤ 16),以空格隔开。
输出描述
为每个测试实例输出转换后的数,每个输出占一行。如果N大于9,则对应的数字规则参考16进制(比如,10用A表示,等等)
示例 1
输入
7 2
输出
111
思路1:
- 十进制转任何其他进制都可以用
十进制数取模需要转换的进制(转二进制就取模二)
取模的结果记录下来 - 十进制数除以需要转换的进制,所得的结果继续取模
- 直到十进制数为0,逆置所有取模的结果就是需要转换的进制
本题需要注意的是十进制数可能为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;
}