第一题:
描述: |
目描述: 编写一个函数,将字符串中的大写的字母(A~Z)挑出来,同时保留原字符串中的空格,将挑出的大写字母和空格按原始位置组成新的字符串。 例如: 1)输入:AUStralia; 输出:AUS 2)输入:He Is a DoG 输出:H I DG |
运行时间限制: |
1 Sec |
内存限制: |
128 MByte |
输入: |
字符串 |
输出: |
仅有大写字母和空格的字符串 |
样例输入: |
AUStralia |
样例输出: |
AUS |
#include <string> #include <iostream> using namespace std; int main() { string str; getline(cin,str); string substr; bool chuxian=false;//判断第一个大写字母出现 for(int i=0;i<str.size();i++) { if(str[i]>='A'&&str[i]<='Z') { substr.append(1u,str[i]); chuxian=true; } else if(str[i]==' '&&chuxian)//只有第一个大写字符出现,才能加空格 { substr.append(1u,str[i]); } } cout<<substr<<endl; return 0; }第二题:
描述: |
根据依次输入的数字,按到从大到小排序 |
运行时间限制: |
10 Sec |
内存限制: |
128 MByte |
输入: |
一行正整数,其长度小于4096,整数之间用非数字隔开 |
输出: |
排序后的整数,一个空格隔开 |
样例输入: |
8 7R9t2 5 3 |
样例输出: |
9 8 7 5 3 2 |
补充:
样例输入: 8er7Rd9st2 5 3
样例输出: 9 8 7 5 3 2
样例输入: er7Rd9st2 5 3
样例输出: 9 7 5 3 2
#include <vector> #include <string> #include <iostream> #include <set> using namespace std; int main() { multiset<int> num; int n; string str; getline(cin,str); string substr; for(int i=0;i<str.size()+1;i++) { if(str[i]>='0'&&str[i]<='9') { substr.append(1u,str[i]); } else { if(i>=1&&str[i-1]>='0'&&str[i-1]<='9') { n=atoi(const_cast<char*>(substr.c_str())); num.insert(n); //substr.swap(string(" ")); substr.clear(); } } } int k=0; int size=num.size(); for(multiset<int>::reverse_iterator iter=num.rbegin();iter!=num.rend();++iter) { cout<<*iter<<" "; if(k<size) cout<<" "; } cout<<endl; return 0; }第三题:
描述: |
给你一个N*M的矩阵,每个位置的值是0或1,求一个面积最大的子矩阵,这个矩阵必须是一个正方形,且里面只能由1构成,输出最大的正方形边长 |
运行时间限制: |
2 Sec |
内存限制: |
无限制 |
输入: |
第一行输入两个整数n,m,之后n行,每行m个数字,为矩阵第i行第j列的值,只可能是0或者1 |
输出: |
一个整数,为最大正方形的边长 |
样例输入: |
3 3 1 1 1 1 1 1 0 0 1 |
样例输出: |
2 |
#include <stdio.h> #include <string.h> #include <stdlib.h> int max(int i,int j) { return i>=j?i:j; } int min(int i,int j) { return i<=j?i:j; } #define MAXN 1001 int matrix[MAXN][MAXN]; int lagest_rectangle(/*int **matrix, */int m, int n) { int i, j; int *H = (int*) malloc(n * sizeof(int)); // 高度 int *L = (int*) malloc(n * sizeof(int)); // 左边界 int *R = (int*) malloc(n * sizeof(int)); // 右边界 int ret = 0; memset(H, 0, n * sizeof(int)); memset(L, 0, n * sizeof(int)); for (i = 0; i < n; i++) R[i] = n; for (i = 0; i < m; ++i) { int left = 0, right = n; // calculate L(i, j) from left to right for (j = 0; j < n; ++j) { if (matrix[i][j] == 1) { ++H[j]; L[j] = max(L[j], left); } else { left = j + 1; H[j] = 0; L[j] = 0; R[j] = n; } } // calculate R(i, j) from right to left for (j = n - 1; j >= 0; --j) { if (matrix[i][j] == 1) { R[j] = min(R[j], right); ret = max(ret, min(H[j],R[j] - L[j])); } else { right = j; } } } return ret; } int main() { int m, n; int i, j; while (scanf("%d%d", &m, &n) > 0) { for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { scanf("%d", &matrix[i][j]); } } printf("%d\n", lagest_rectangle(m, n)); } return 0; }