2019疯狂游戏实习生笔试题

3月16号上午10点到11点半一共三道题

  1. 输入数n,求从1到n所有被3整除、被5整除和同时被两者整除的数并输出。
  2. 输入字符串,将字符串每一个字母变成其后边一个(abc变成bcd)并将变化后的a、e、i、o、u变成大写。
  3. 输入若干组字符串(包含0或1),求1能组成的最大正方形的边长。
    例:1110、1110、1110、0000 输出3,110、110、001 输出2,100、000、000输出1.

前两个题极其简单,分分钟搞定,最后一个题编着编着就蒙了,本身不难,博主选择的是逻辑性较强的解法,加上紧张最后也没全做出来,只过了25%,考试结束理清思路分分钟解决(要哭了)。

以下是第三题解题思路及代码实现
取长或宽小的那一个做最大边长max,判断成不成立,不成立max–,再继续判断。
输入:3 //行数
110 //第一行
110 //第二行
000 //第三行

#include<iostream>
#include<algorithm>
#include<sstream>
#include<string>
#include<vector>
using namespace std;
int MaximalSquare(const vector<string>& strArr,const unsigned int size){
 int n=strArr[0].size();
 int max;
 int l=0,r=0;
 int i,j;
 bool flag=true;
 if(n>size)
  max=size;
 else
  max=n;
 while(max>1){
  while((r+max)<=n){
   while((l+max)<=size){
    for(i=r;i<(max+r);i++){
     for(j=l;j<(max+l);j++){
      if(strArr[i][j]=='0'){
       flag=false;
       break;
      }
     }
     if(strArr[i][j]=='0')
      break;
    }
    l=l+max;
   }
   r=r+max;
  }
  if(flag)
   return max;
  max=max-1;
  l=0;
  r=0;
  flag=true;
 }
} 
int main(){
 int n;
 cin>>n;
 vector<string> strs;
 for(int i=0;i<n;i++){
  string s;
  cin>>s;
  strs.push_back(s);
  }
  cout<<MaximalSquare(strs,strs.size());
  return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39187019/article/details/88595965
今日推荐