目录
1.螺旋打印
2.键盘重复
3.字符串中有几个相同单词
4.待更新…
第一题:
思路:
设置四个边界:up,down,left,right.然后在每次循环后改变其值,并进行判断是否越界,如果越界,则终止循环。
int main(){
int n;
scanf("%d",&n);
int num = 1;
int up = 0,down = n-1,left = 0,right = n-1;
while(true){
for(int i = left;i<=right;++i ){
ans[up][i] = num++;
}
++up;//因为向下逼近。所以增大up
if(up>down) break;
for(int i = up;i<=down;++i ){
ans[i][right] = num++;
}
--right;//因为向左逼近。所以减小right
if(left>right) break;
for(int i = right;i>=left;--i ){
ans[down][i] = num++;
}
--down;//因为向shang逼近。所以减小down
if(down<up) break;
for(int i = down;i>=up;--i ){
ans[i][left] = num++;
}
++left;//因为向shang逼近。所以增大left
if(right<left) break;
}
for(int i = 0;i<n;++i){
for(int j = 0;j<n;++j){
cout<<ans[i][j];
}
cout<<endl;
}
return 0;
}
第二题:
题目来源有点忘了(哈哈)
大概题目:
有一个字符串比如1111aaaadd333f3。键盘坏了,因此会输出多个字母,让你输出原先的正确序列,按照题意,应该输出1add333f。因为最后有一个单独的3,因此说3这个键是没坏的。
string s;
int num;
bool hashtable[128]={false};
int len = s.length();
for(int i = 0;i<len-1;++i){
if(str[i]==str[i+1]){
int j = i;
num = 1;
while(j+1<len&&s[j]==s[j+1]){
num++;
if(num>=n)//超过n认为可能出现错误;
{
hashtable[s[j]]==true;
}
}
}
i = j;
}
//下面这个循环用来判断那些键是没坏的,将假的true重新改成false;
for(int i= 0;i<len;++i){
if(hashtable[s[i]]==true){
int k = i;
num = 1;
while(s[k]==s[k+1]){
++num;
}
if(num<n) hashtable[s[k]]= false;
}
i = k;
}
第三题:
有一串字符can1_ can i have a can can,统计其中出现最多的字符数
思路:从头开始遍历,并用map进行映射统计,对最后留下的一个字符记得要进行处理,这里注意的是读入的时候要用getline,别用cin,因为cin遇到空格会结束。
int main(){
string s;
getline(cin,s);
int i = 0;
string word = "";
while(i<s.length()){
if(s[i]==' '){
if(word!=""){
if(ans.find(word)!=ans.end()){
ans[word]++;
}else{
ans[word] = 1;
}
word = "";
}
}else{
word+=s[i];
}
++i;
}
if(word!=""){
if(ans.find(word)!=ans.end()){
ans[word]++;
}else{
ans[word] = 1;
}
}
int Max = -1;
for(map<string,int>::iterator it = ans.begin();it!=ans.end();++it){
if(it->second>Max){
word = it->first;
Max = it->second;
}
}
printf("%s\n",word.c_str());
cout<<ans[word];
return 0;
}