华为 2019校园招聘笔试-9.05

版权声明:本人ZZU在校学生,文章均为个人心得,有不足之处请不吝赐教! https://blog.csdn.net/whl_program/article/details/82431562

三道编程题,2小时,不难。
拿别人的题做的,应该能AC,没有提交

第一题 求26进制的和
给出两个26进制的数,求和
01
思路:
求和,依次加起来,求模,另外找一个数组计算进位就好。
Java AC代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String a = sc.next();
        String b = sc.next();
        int[] as = charToint(a.toCharArray());
        int[] bs = charToint(b.toCharArray());
        if (as.length >= bs.length) {
            add(as, bs);
        } else {
            add(bs, as);
        }
    }

    private static void add(int[] a, int[] b) {
        int jw = 0;
        for (int i = 0; i < b.length; i++) {
            int tmp = a[a.length - i - 1] + b[b.length - i - 1] + jw;
            a[a.length - i - 1] = tmp % 26;
            jw = tmp / 26;
        }

        for (int i = b.length; i < a.length; i++) {
            if (jw == 0) {
                break;
            }
            int tmp = a[a.length - i - 1] + jw;
            a[a.length - i - 1] = tmp % 26;
            jw = tmp / 26;
        }

        if (jw != 0) {
            System.out.print((char) (jw + 'a'));
            syso(a);
        }else {
            syso(a);
        }

    }

    private static void syso(int[] a) {
        for (int i = 0; i < a.length; i++) {
            System.out.print((char) (a[i] + 'a'));
        }
    }

    private static int[] charToint(char[] arr1) {
        int[] result = new int[arr1.length];
        for (int i = 0; i < result.length; i++) {
            result[i] = arr1[i] - 'a';
        }
        return result;
    }
}

第二题:
02
思路:
1. 遍历第一个字符串,vector记录字符是否存在
2. 遍历第二个字符串,判断字符在vector中对应值是否为1
3. vector中对应值是否为0,false 否则输出true

代码:

#include <vector>
#include <string>
#include <iostream>
using namespace std;
int arr[26];
int main()
{
     string str1, str2;
     cin >> str1 >> str2;
     int arr[26];
     bool flag = true;
     for(int i=0; i<str1.size(); i++){
        int temp1 = str1[i]-'A';
        arr[temp1] = 1;
     }
     for(int i=0; i<str2.size(); i++){
        int temp2 = str2[i]-'A';
        if(arr[temp2] != 1){
            flag = false;
            break;
        }
     }
     cout << flag << endl;
     return 0;
}

第三题:
03.png

这道题似乎样例给错了,
如果样例给的是对的,当数量相等时按照ASCII和判断大小
如果样例给的是错的,当数量相等时直接按照a.val< b.val判断大小

假设样例是对的,给定以下代码
思路:
1. struct中key代表字符串数量,val代表字符串,sum代表字符串ASCII码值的和
2. 遍历第一个字符串,截取字符串,并记录字符串对应数量,组成node存入vector中
3. 定义cmp比较函数,对vector数组进行排序
4. 遍历输出

代码:

#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
struct node{
    int key;
    string val;
    int sum;
};
bool cmp(node a, node b){
    if(a.key != b.key)
        return a.key < b.key;
    if(a.key==b.key && a.sum!=b.sum)
        return a.sum < b.sum;
}

int main()
{
     string str;
     cin >> str;
     vector<node> arr;
     string s = "";
     int xint = 0;
     int xsum = 0;
     for(int i=0; i<str.size(); i++){
        node temp;
        if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')){
            s += str[i];
            if(str[i]>='a' && str[i]<='z')
                xsum += (str[i]-'a');
            else
                xsum += (str[i]-'A');
        }
        if(str[i]>='0' && str[i]<='9')
            xint = xint*10 + (str[i]-'0');
        if( (str[i]>='0'&&str[i]<='9') &&
            (i==str.size()-1 || (str[i+1]<'0'||str[i+1]>'9'))
            ){
            temp.key = xint;
            temp.val = s;
            temp.sum = xsum;
            arr.push_back(temp);
            xint = 0;
            s = "";
            xsum = 0;
        }
     }
     sort(arr.begin(), arr.end(), cmp);
     string res = "";
     for(int i=0; i<arr.size(); i++){
        for(int j=0; j<arr[i].key; j++)
            res += arr[i].val;
     }
     cout << res << endl;
     return 0;
}

猜你喜欢

转载自blog.csdn.net/whl_program/article/details/82431562