算法分析实验题:1.利用string实现 求字符串中单词的个数。输出并显示。2.利用vector实现求第k小的元素。以上均参考课堂例题。
时间: 2024-09-10 22:07:50 浏览: 82
基于Java的K-means实验算法设计与实现.zip
5星 · 资源好评率100%
要解决这两个问题,我们可以分别使用字符串处理和排序算法的知识。
1. 求字符串中单词的个数:
这个问题可以通过遍历字符串,使用空格作为单词间的分隔符来解决。当遇到一个字符不是空格时,我们可以认为是单词的开始,然后继续遍历直到下一个空格出现,这样就可以计算出一个单词。遍历整个字符串,统计单词的数量即可。
```cpp
#include <iostream>
#include <string>
using namespace std;
int countWords(const string& str) {
int count = 0;
bool inWord = false;
for (char ch : str) {
if (ch == ' ') {
if (inWord) {
count++;
inWord = false;
}
} else {
inWord = true;
}
}
if (inWord) { // 需要检查最后一个单词
count++;
}
return count;
}
int main() {
string str;
getline(cin, str);
cout << "单词个数: " << countWords(str) << endl;
return 0;
}
```
2. 利用vector实现求第k小的元素:
这个问题可以使用快速选择算法(类似于快速排序的选择部分),或者直接对vector进行排序后取第k个元素。
快速选择算法的核心思想是选取一个枢轴元素,然后将数组中的其他元素与这个枢轴元素比较,将小于枢轴的元素放到其左边,大于枢轴的元素放到其右边。如果枢轴恰好在第k个位置,则枢轴就是第k小的元素;如果枢轴在第k个位置的左边,则递归地在枢轴的右半边继续寻找;如果枢轴在第k个位置的右边,则递归地在枢轴的左半边继续寻找。
以下是使用快速选择算法的示例代码:
```cpp
#include <iostream>
#include <vector>
using namespace std;
int partition(vector<int>& nums, int left, int right) {
int pivot = nums[left];
int l = left + 1;
int r = right;
while (l <= r) {
if (nums[l] > pivot && nums[r] < pivot) {
swap(nums[l++], nums[r--]);
}
if (nums[l] <= pivot) l++;
if (nums[r] >= pivot) r--;
}
swap(nums[left], nums[r]);
return r;
}
int quickSelect(vector<int>& nums, int left, int right, int k) {
if (left == right) return nums[left];
int pivotIndex = partition(nums, left, right);
if (k == pivotIndex) {
return nums[k];
} else if (k < pivotIndex) {
return quickSelect(nums, left, pivotIndex - 1, k);
} else {
return quickSelect(nums, pivotIndex + 1, right, k);
}
}
int findKthSmallest(vector<int>& nums, int k) {
return quickSelect(nums, 0, nums.size() - 1, k - 1);
}
int main() {
vector<int> nums;
int n, k;
cin >> n;
for (int i = 0; i < n; ++i) {
int num;
cin >> num;
nums.push_back(num);
}
cin >> k;
cout << "第" << k << "小的元素是: " << findKthSmallest(nums, k) << endl;
return 0;
}
```
请注意,上面的代码示例是基于C++语言的,如果需要在其他编程语言中实现,需要做相应的调整。
阅读全文