编程题——真题训练三(AQY)

目录

 

循环数比较

判断题

删除重复字符


  • 循环数比较

题目描述:对于任意两个正整数x和k,我们定义repeat(x, k)为将x重复写k次形成的数,例如repeat(1234, 3) = 123412341234,repeat(20,2) = 2020.
牛牛现在给出4个整数x1, k1, x2, k2, 其中v1 = (x1, k1), v2 = (x2, k2),请你来比较v1和v2的大小。

输入描述:

输入包括一行,一行中有4个正整数x1, k1, x2, k2(1 ≤ x1,x2 ≤ 10^9, 1 ≤ k1,k2 ≤ 50),以空格分割

输出描述:

如果v1小于v2输出"Less",v1等于v2输出"Equal",v1大于v2输出"Greater".

示例:

输入:

1010 3 101010 2

输出:

Equal

解题代码一(自己,凉码):

#include

using namespace std;

int main(){
    int x1,x2, k1, k2;
    cin >> x1 >> k1 >> x2 >> k2;

    long long res1 = 0;
    long long res2 = 0;
    
    int temp = 1;
    int count1 = 1;
    int count2 = 1;
    //求x1的位数
    while(temp){
        temp = x1/10;
        count1 = count1 * 10;
    }
    //求x2的位数
    temp = 1;
    while(temp){
        temp = x2/10;
        count2 = count2 * 10;
    }
    
    while(k1 != 0){
        k1 = k1 - 1;
        res1 = res1*count1 + x1; 
    }
    while(k2 != 0){
        k2 = k2 - 1;
        res2 = res2*count2 + x2;
    }
    
    if(res1 == res2){
        cout << "Equal" << endl;
    }else if(res1 < res2){
        cout << "Less" << endl;
    }else if(res1 > res2){
        cout << "Greater" << endl;
    }
    
    return 0;
}

解题思路:别看了,这个代码凉了。逻辑没问题,但过不了,复杂度太高。

解题代码二(输入数字转字符串):

#include
#include

using namespace std;

string int2str(int x){
    stringstream ss;
    ss << x;
    return ss.str();
}

string repeat(string s, int k){
    string ss = "";
    while(k--){
        ss += s;
    }
    return ss;
}

int main(){
    int x1,x2, k1, k2;
    cin >> x1 >> k1 >> x2 >> k2;
    string s1, s2;
    s1 = int2str(x1);
    s2 = int2str(x2);
    if(s1.length()*k1 < s2.length()*k2){
        cout << "Less" << endl;
    }else if(s1.length()*k1 > s2.length()*k2){
        cout << "Greater" << endl;
    }else{
        s1 = repeat(s1, k1);
        s2 = repeat(s2, k2);
        if(s1.compare(s2) < 0){
            cout << "Less" << endl;
        }else if(s1.compare(s2) > 0){
            cout << "Greater" << endl;
        }else{
            cout << "Equal" << endl;
        }
    }
    
    return 0;
}

解题思路:

  1. 首先数字手动转为字符串,代码int2str()要记下来(这是数字转字符串的工具)。除了用sstream库的方法,我们可以直接用to_string(int x)这个函数,将Int类型的x转为字符串。
  2. 然后对比x1重复k1次,和x2重复k2次的长度大小。
  3. 如果长度相同,则将字符串重复k1或k2次,然后用字符串比较函数,比较两个字符串谁大。
  4. 这道题其实可以直接将 x1,x2初始化为string,这样就避免了int转str的过程。
    string x1, x2;
    int k1, k2;
    cin << x1 << x2 << k1 << k2;

     

知识点:

字符串函数:

string x, y;

  1. x+y:代表y拼接在x后面。
  2. x.push_back(y):出错,因为push_back(char x),只能加入字符。
  3. x.compare(y) :字符串比较函数,比较字符串(含纯数字)的大小。x.compare(y) <0 代表 x更小,>0 代表 x更大,=0代表x,y相等。

数字转字符串:

int2str 函数里的代码必须背熟练,这是数字转字符串的工具。


  • 判断题

题目描述:牛牛参加了一场考试,考试包括n道判断题,每做对一道题获得1分,牛牛考试前完全没有准备,所以考试只能看缘分了,牛牛在考试中一共猜测了t道题目的答案是"正确",其他的牛牛猜为"错误"。考试结束后牛牛知道实际上n道题中有a个题目的答案应该是"正确",但是牛牛不知道具体是哪些题目,牛牛希望你能帮助他计算可能获得的最高的考试分数是多少。

输入描述:

输入包括一行,一行中有三个正整数n, t, a(1 ≤ n, t, a ≤ 50), 以空格分割

输出描述:

输出一个整数,表示牛牛可能获得的最高分是多少。

示例:

输入:

3 1 2

输出:

2

解题代码:

#include

using namespace std;

int main(){
    int num, me_right, true_right;
    int wrong;
    int res;
    cin >> num >> me_right >> true_right;
    
    if(true_right > me_right){
        wrong = true_right - me_right;
        res = num - wrong;
    }else if(true_right == me_right){
        res = num;
    }else{
        wrong = me_right - true_right;
        res = num - wrong;
    }
    cout << res << endl;
    
    return 0;
}

解题思路:

  1. 请忽略变量名的奇怪,这是为了方便区分,t,n,a这样的变量实在分不清谁是谁。
  2. 这道题的关键在于,题目描述里说的“计算可能获得的最高考试分数”,可能的,最高的,那么在这种情况下,我们就认为,牛牛选对的题,本来也是对的。
  3. 所以,根据牛牛选对的题个数和真正对的题个数之间的大小对比,我们就可以得到可能的最高的分数。

  • 删除重复字符

题目描述:牛牛有一个由小写字母组成的字符串s,在s中可能有一些字母重复出现。比如在"banana"中,字母'a'和字母'n'分别出现了三次和两次。但是牛牛不喜欢重复。对于同一个字母,他只想保留第一次出现并删除掉后面出现的字母。请帮助牛牛完成对s的操作。

输入描述:

输入包括一个字符串s,s的长度length(1 ≤ length ≤ 1000),s中的每个字符都是小写的英文字母('a' - 'z')

输出描述:

输出一个字符串,表示满足牛牛要求的字符串

示例:

输入:

banana

输出:

ban

解题代码:

#include
#include

using namespace std;

int main(){
    string text;
    string str = "";
    cin >> text;
    mapm;
    for(int i = 0; i < text.length(); i++){
        m[text[i]]++;
    }
    
    for(int i = 0; i < text.length(); i++){
        if(m[text[i]] >0){
            str = str + text[i];
            m[text[i]] = 0;
        }
    }
    
    cout << str << endl;
    return 0;
}

解题思路:

  1. 这道题和剑指欧肥儿“第一个只出现一次的字符”这道题很相似,会了那道题就会这道题了。
  2. 详情思路请见我的博客 “编程题——关于字符串"里的“第一个只出现一次的字符”这道题的解析。

 

你可能感兴趣的:(AQY,算法题,真题)