1.写一个算法,统计在输入字符串中我各个不同字符出现的频度(字符串中的合法字符为A~Z这26个字母和0~9这10个数字)。
#include <iostream>
#include <string>
using namespace std;
void statistic(string str) {
int freq[128] = {0};
for (auto c : str) {
if (c >= 'A' && c <= 'Z' || c >= '0' && c <= '9') {
freq[c] ++;
}
}
for (int i = 0; i < 128; i++) {
if (freq[i] != 0) {
cout << (char)(i) << " : " << freq[i] << endl;
}
}
}
int main() {
statistic("DAY0: HELLO THANK YOU, THANK YOU VERY MUCH!");
return 0;
}
2.写一个递归算法来实现字符串逆序存储,要求不另设存储空间。
#include <iostream>
#include <string>
using namespace std;
void reverse(string& str, int start, int end) {
if (start < end) {
char t = str[start];
str[start] = str[end - 1];
str[end - 1] = t;
reverse(str, start + 1, end - 1);
}
}
int main() {
string str = "DAY0: HELLO THANK YOU, THANK YOU VERY MUCH!";
reverse(str, 0, str.size());
cout << str << endl;
return 0;
}
3.编写算法,实现下面函数的功能。函数void Insert(char* s, char* t, int pos)将字符串t插入到字符串s中,插入位置为pos。假设分配给字符串s的空间足够让字符串t插入。(说明:不得使用任何库函数)。
#include <iostream>
#include <string>
using namespace std;
void Insert(char* s, char* t, int pos) {
int len_s = 0, len_t = 0;
while (s[len_s] != 0)
{
len_s++;
}
while (t[len_t] != 0)
{
len_t++;
}
for (int i = len_s; i >= pos; i--) {
s[i + len_t] = s[i];
}
for (int i = pos, j = 0; j < len_t; i++, j++) {
s[i] = t[j];
}
}
int main() {
char str1[100] = "1234567890";
char str2[] = "abcdefg";
Insert(str1, str2, 9);
cout << str1 << endl;
return 0;
}
4.已知字符串s1中存放一段英文,写出算法Format(s1, s2, s3, n),将其按给定的长度n格式化成两端对齐的字符串s2(即长度为n, 且首尾字符不得为空格),其多余的字符送s3。
#include <iostream>
#include <string>
using namespace std;
void Format(string str, char* s2, char* s3, int n) {
int k = 0, s2_size = 0, s3_size = 0;
while (k < str.size() && str[k] == ' ') { //过滤左边空格
k++;
}
while ( k < str.size() && s2_size < n) { //取n个字符放s2
s2[s2_size++] = str[k++];
}
if (s2_size > 0 && s2[s2_size - 1] == ' ') {
while (k < str.size() && str[k] == ' ') {
k++;
}
if (k < str.size()) {
s2[s2_size - 1] = str[k++];
}
}
while (k < str.size()) //剩下的放s3
{
s3[s3_size++] = str[k++];
}
s2[s2_size] = 0;
s3[s3_size] = 0;
}
int main() {
char str1[100] = " Today, I will tell you that you are stupid! ";
char str2[100];
char str3[100];
Format(str1, str2, str3, 15);
cout << str2 << endl;
cout << str3 << endl;
return 0;
}
5.设二维数组
a
[
1
,
.
.
.
,
m
,
1
,
.
.
.
,
n
]
a[1,...,m,1,...,n]
a[1,...,m,1,...,n]含有
m
×
n
m\times n
m×n个整数。
(1)写一个算法判断
a
a
a中所有元素是否互不相同?输出相关信息(yes/no);
(2)试分析算法的时间复杂度
#include <iostream>
#include <set>
using namespace std;
bool judge(int matrix[100][100], int rows, int cols) {
set<int> se;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (se.find(matrix[i][j]) != se.end()) {
return false;
}
else {
se.insert(matrix[i][j]);
}
}
}
return true;
}
int main() {
int matrix[100][100] = { 0 };
matrix[0][0] = 0;
matrix[0][1] = 1;
matrix[0][2] = 2;
matrix[1][0] = 3;
matrix[1][1] = 4;
matrix[1][2] = 5;
matrix[2][0] = 6;
matrix[2][1] = 7;
matrix[2][2] = 8;
if (judge(matrix, 3, 3)) {
cout << "yes" << endl;
}
else {
cout << "no" << endl;
}
return 0;
}
如果集合的查找时间效率是
O
(
1
)
O(1)
O(1), 寻么整个算法的时间复杂度则是
O
(
n
2
)
O(n^2)
O(n2)。
6.设任意 n n n个整数存放于数组 A ( 1 : n ) A(1:n) A(1:n)中,试编写算法,将所有正数排在负数前面(要求算法复杂度为 O ( n ) O(n) O(n))。
提示: 空间复杂度要求为 O ( 1 ) O(1) O(1)
提示: 利用快排的思想
#include <iostream>
#include <vector>
using namespace std;
void transform(vector<int>& in) {
int i = 0, j = in.size() - 1;
while (i < j)
{
while (in[i] >= 0 && i < j) i++;
while (in[j] < 0 && i < j) j--;
if (i < j) {
int t = in[i];
in[i] = in[j];
in[j] = t;
}
}
}
int main() {
vector<int> nums = { 1, -3, 5, -7, 0, 9, -11, 13 };
transform(nums);
for (auto& i : nums) {
cout << i << " ";
}
return 0;
}