招商银行信用卡中心2018春招IT笔试(开发方向第一批)

119 篇文章 0 订阅

题目名称:
字符串是否由子串拼接
题目描述:
给出一个非空的字符串,判断这个字符串是否是由它的一个子串进行多次首尾拼接构成的。
例如,"abcabcabc"满足条件,因为它是由"abc"首尾拼接而成的,而"abcab"则不满足条件。
输入描述:
非空字符串
输出描述:
如果字符串满足上述条件,则输出最长的满足条件的的子串;如果不满足条件,则输出false。
输入:
abcabc
输出:
abc
题意:
题目描述
题解
遍历重复子串所有的可能情况
重复子串的长度必须能被字符串s整除
假设子串长度为len,判断是否是重复子串
代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
 
int main() {
    string s;
    while(cin >> s){
        int len = 1;
        bool flag = false;
        for(len = 1; len < s.size(); len ++){
            if(s.size()%len != 0) continue;
            int pos = 0;
            int i = len;
            for(i = len;i < s.size(); i ++){
                if(s[i] == s[pos]){
                    pos ++;
                    if(pos == len){
                        pos = 0;
                    }
                }
                else{
                    break;
                }
            }
            if(pos == 0 && i == s.size()){
                cout << s.substr(0,len) << "\n";
                flag = true;
                break;
            }
        }
        if(!flag) printf("false\n");
    }
    return 0;
}

题目名称:
寻找合法字符串
题目描述:
给出一个正整数n,请给出所有的包含n个’(‘和n个’)‘的字符串,使得’(‘和’)‘可以完全匹配。
例如:
‘(())()’,’()()()’ 都是合法的;
'())()('是不合法的。
请按照__字典序__给出所有合法的字符串。
输入描述:
输入为1个正整数
输出描述:
输出为所有合法的字符串,用英文逗号隔开
输入:
2
输出:
(()),()()
题意:
题目描述
题解
简单dfs,直接爆搜左右括号
代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
 
vector<string> v;
 
void find_str(int l,int r,string str){
    if(l == 0 && r == 0){
        v.push_back(str);
        return ;
    }
    if(l > 0) find_str(l - 1,r,str + "(");
    if(r > l) find_str(l,r - 1,str + ")");
}
 
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        find_str(n,n,"");
        for(int i = 0; i < v.size(); i ++){
            cout<<v[i];
            if(i != v.size() - 1) cout<<",";
        }
        cout<<endl;
    }
    return 0;
}

题目名称:
整数成绩最大化
题目描述:
给出一个整数n,将n分解为至少两个整数之和,使得这些整数的乘积最大化,输出能够获得的最大的乘积。
例如:
2=1+1,输出1;
10=3+3+4,输出36。
输入描述:
输入为1个整数
输出描述:
输出为1个整数
输入:
10
输出:
36
题意:
题目描述
题解
1,2,3,4单独拿出来
然后其他的分成k个3一定是最优解
代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
 
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        if(n == 1) printf("0\n");
        else if(n == 2) printf("1\n");
        else if(n == 3) printf("2\n");
        else if(n == 4) printf("4\n");
        else{
            int sum = 1;
            while(n){
                n -= 3;
                sum *= 3;
                if(n == 2){
                    sum *= 2;
                    break;
                }
                else if(n == 4){
                    sum *= 4;
                    break;
                }
            }
            printf("%d\n",sum);
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值