第一题:
描述: | 目描述: 编写一个函数,将字符串中的大写的字母(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 1001int 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 rightfor (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 leftfor (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;
}