欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

华为 2019校园招聘笔试-2018.09.05

程序员文章站 2024-03-15 16:19:18
...

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

第一题 求26进制的和
给出两个26进制的数,求和
华为 2019校园招聘笔试-2018.09.05
思路:
求和,依次加起来,求模,另外找一个数组计算进位就好。
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;
    }
}

第二题:
华为 2019校园招聘笔试-2018.09.05
思路:
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;
}

第三题:
华为 2019校园招聘笔试-2018.09.05

这道题似乎样例给错了,
如果样例给的是对的,当数量相等时按照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;
}