数据结构习题解析与实验指导第四章(串、数组和广义表)课后算法设计题

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;
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值