面向过程
Lab3-03 去重排序
写法1,时间复杂度O(n2)O(n^2)O(n2)
#include<stdio.h>
#include<iostream>
#include<vector>
using namespace std;
int main()
{
char order;
cin >> order;
vector<int> vi;
char ch = ' ';
int x = 0;
while(ch!='\n'){
cin >> x;
vi.push_back(x);
ch = cin.get();
}
//先排序
if(order == 'A') { //升序
for (int i = 0; i < vi.size(); i++) {
int most = 1000;
int most_i = 0;
for (int j = i; j < vi.size(); j++) { //每次找到最小的放到前面
if (vi[j] < most) {
most = vi[j];
most_i = j;
}
}
int temp = vi[i]; //交换
vi[i] = vi[most_i];
vi[most_i] = temp;
}
}
else if(order == 'D') { //降序
for (int i = 0; i < vi.size(); i++) {
int most = 0;
int most_i = 0;
for (int j = i; j < vi.size(); j++) { //每次找到最小的放到前面
if (vi[j] > most) {
most = vi[j];
most_i = j;
}
}
int temp = vi[i]; //交换
vi[i] = vi[most_i];
vi[most_i] = temp;
}
}
//再去重
for(int i=0; i<vi.size(); i++){
int k = 1;
while(vi[i]==vi[i+k]&&(i+k)<vi.size()) k++;
if(k>1){
for(int j=i+1;j<vi.size()-k+1;j++) vi[j] = vi[j+k-1];
for(int p=0;p<k-1;p++) vi.pop_back();
}
}
for(int i=0;i<vi.size()-1; i++) cout << vi[i] << " ";
cout << vi[vi.size()-1];
}
写法2,哈希,时间复杂度O(M)O(M)O(M)
#include<stdio.h>
#include<iostream>
#include<vector>
using namespace std;
int main()
{
char order;
cin >> order;
vector<int> vi;
char ch = ' ';
int x = 0;
while(ch!='\n'){
cin >> x;
vi.push_back(x);
ch = cin.get();
}
int a[1001];
for(int i=0; i<1001; i++) a[i] = 0;
for(int i=0; i<vi.size(); i++) a[vi[i]] = 1;
int num=0;
if(order=='A'){
for(int i=1;i<=1000;i++){
if(a[i]==1){
vi[num] = i;
num++;
}
}
}
else if(order=='D'){
for(int i=1000; i>0; i--){
if(a[i]==1){
vi[num] = i;
num++;
}
}
}
for(int i=0;i<num-1;i++) cout<<vi[i]<<" ";
cout << vi[num-1];
}
写法3,用到set
#include<stdio.h>
#include<iostream>
#include<vector>
#include<set>
using namespace std;
int main()
{
char order;
cin >> order;
vector<int> vi;
char ch = ' ';
int x = 0;
while(ch!='\n'){
cin >> x;
vi.push_back(x);
ch = cin.get();
}
set<int> st;
for(int i=0;i<vi.size();i++){
st.insert(vi[i]);
}
if(order=='A'){
set<int>::iterator it=st.begin();
cout << *it;
for(it++;it!=st.end();it++){
cout << ' ' << *it;
}
}
}
字符串
Lab04_02 小写变大写
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
string s;
cin >> s;
for(int i=0; i<s.size(); i++){
if(s[i]<='z'&&s[i]>='a') s[i]=s[i]-32;
}
cout << s;
}
排序
#include<iostream>
using namespace std;
void swp(string& s, int i, int j){
char swp;
swp = s[i];
s[i] = s[j];
s[j] = swp;
}
int find_last(string s, int end){ //找到end前最后一个字母的位置
for (int i = end-1; i >= 0; i--)
{
if (s[i] >= 'A'&&s[i] <= 'Z')
return i;
}
return -1;
}
int main(){
string s;
cout << "输入字符串" << endl;
cin >> s;
//先找到字符串中第一个出现大写字母与最后出现大写字母的位置
int begin=0;
int end=0;
for(int i=0; i<s.size(); i++){
if(s[i]>='A'&&s[i]<='Z'){
begin = i;
break;
}
}
for(int j=0; j<s.size(); j++){
if(s[j]>='A'&&s[j]<='Z') {
end = j;
}
}
//从begin到end,每次选出最大的字符串放到后面
while(end>begin){
char max = s[begin];
int max_i = begin;
for(int i=begin; i<=end; i++){
if(s[i]>max&&s[i]>='A'&&s[i]<='Z'){
max=s[i];
max_i = i;
}
}
swp(s, max_i, end);
end = find_last(s, end);
}
cout << "输出已排序字符串" << endl;
cout << s << endl;
return 0;
}
指针
矩阵转置
#include<iostream>
#include<string>
using namespace std;
void trans_mtx(int **a, int n)
{
int b[n][n];
for(int i = 0; i < n; i++){
for(int j=0; j<n; j++){
b[i][j] = a[i][j];
}
}
for(int i = 0; i < n; i++){
for(int j=0; j<n; j++){
a[i][j] = b[j][i];
}
}
}
void print_mtx( int **a, int n)
{
int i;
for(i = 0; i < n; i++){
for(int j=0; j<n; j++){
cout << a[i][j] << "";
}
cout << endl;
}
}
int main()
{
char* p[3];
char str[][5] = {"abc","def","ghi"};
int* addre[3];
int a[3][3] = {{1,2,3},
{1,2,3},
{1,2,3}};
addre[0] = &a[0][0];
addre[1] = a[1];
addre[2] = a[2];
trans_mtx(addre, 3);
print_mtx(addre, 3);
return 0;
}
博客围绕面向过程、字符串和指针展开。面向过程部分介绍 Lab3 - 03 去重排序的三种写法及时间复杂度;字符串部分提及 Lab04_02 小写变大写排序;指针部分涉及矩阵转置。
5464

被折叠的 条评论
为什么被折叠?



