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

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

在这里插入图片描述

  • 0
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是第四章的部分习题及答案,希望对你有帮助。 1. 设计一个O(nlogn)时间复杂度的算法,找出一个整数数组的最大差值,其最大值必须位于最小值之后。 解答:可以使用分治法,将数组分成两部分,分别求出左边的最大值和右边的最小值,然后比较两个值之间的差值,取最大值即可。具体实现如下: ```python def max_diff(arr): if len(arr) < 2: return 0 mid = len(arr) // 2 left_max = max(arr[:mid]) right_min = min(arr[mid:]) return max(right_min - left_max, max_diff(arr[:mid]), max_diff(arr[mid:])) ``` 2. 设计一个算法,找出一个整数数组的最大子序列和。 解答:可以使用动态规划法,定义一个状态数组dp,dp[i]表示以第i个元素结尾的最大子序列和,转移方程为:dp[i] = max(dp[i-1] + arr[i], arr[i])。最后返回dp数组的最大值即可。具体实现如下: ```python def max_subarray(arr): if not arr: return 0 dp = [0] * len(arr) dp[0] = arr[0] for i in range(1, len(arr)): dp[i] = max(dp[i-1] + arr[i], arr[i]) return max(dp) ``` 3. 给定一个长度为n的整数序列,设计一个算法,找出其第k大的数。 解答:可以使用快速排序的思想,每次选定一个pivot,将数组分成两部分,左边的元素都小于pivot,右边的元素都大于等于pivot。然后比较pivot的位置和k的大小,如果pivot的位置大于k,则在左边继续查找;如果pivot的位置小于k,则在右边继续查找。具体实现如下: ```python def quick_select(arr, k): if not arr or k > len(arr): return None pivot = arr[-1] left = [x for x in arr[:-1] if x < pivot] right = [x for x in arr[:-1] if x >= pivot] if len(right) == k - 1: return pivot elif len(right) > k - 1: return quick_select(right, k) else: return quick_select(left, k - len(right) - 1) ``` 4. 设计一个算法,找出一个无序整数数组出现次数超过一半的数。 解答:可以使用摩尔投票法,遍历整个数组,维护一个候选数和计数器,如果当前元素等于候选数,则计数器加1;否则计数器减1。如果计数器归零,则将当前元素作为候选数。最后再遍历一遍数组统计候选数的出现次数,如果出现次数超过一半,则返回该候选数。具体实现如下: ```python def majority_element(arr): if not arr: return None candidate = None count = 0 for num in arr: if count == 0: candidate = num count += (1 if num == candidate else -1) if arr.count(candidate) > len(arr) // 2: return candidate else: return None ``` 5. 设计一个算法,找出一个整数数组的两个元素,使它们的和等于一个给定的数。 解答:可以使用哈希表,遍历整个数组,对于每个元素,如果它的补数已经在哈希表,则返回它们的下标;否则将该元素加入哈希表。具体实现如下: ```python def two_sum(arr, target): if not arr: return None table = {} for i, num in enumerate(arr): complement = target - num if complement in table: return (table[complement], i) else: table[num] = i return None ``` 希望这些答案能够帮助你解决算法设计与分析第四章的部分习题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值