第一題:
描述: | 目描述: 編寫一個函數,將字符串中的大寫的字母(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;
}