2020/5/20 农行笔经

导言

总代码放在LeetCode的PlayGround 上的。链接 https://leetcode-cn.com/playground/KLDrK2KK
首先这次笔试题目总体来说还算不错。题目分两部分,选择题和编程题。
选择题80个,60分钟,考察了SQL语句、数据库知识、编程语言C++,JAVA、测试相关、数学运算与推理几大部分,题目相对基础,但时间紧,不会就直接蒙了下一个,到点刚刚完成。
编程题3个,90分钟,主要考察字符串和数组,最后一题当时没跑出来,差点时间修改,但主体代码已完成并提交了,不知道能够得分不,下面来看看这三个编程题目。题目是个大概,记得不是特别清楚。

题目一

一个由字母数字组合的字符串,先是一个字母随后紧跟一个数字,数字代表该字母出现的次数,输出最终的字符串。
输入:A3B5C2
输出:AAABBBBBCC
代码

public static String fun(String s){
        StringBuilder sb = new StringBuilder();
        for(int i = 0;i<s.length();i+=2){
            int idx = s.charAt(i+1) - '0';
            for(int j = 0;j < idx;j++)
                sb.append(s.charAt(i));
        }
        return sb.toString();
    }

时间复杂度:O(N^2)
空间复杂度:O(1)

题目二

对一个字符串加密,加密条件是当索引为偶数时,当前字符向前移动,奇数向后移动,当需加密字符串长度大于数组2时,又从数组2开始位置算起。

示例
输入 text = “hello” encryp = “23151”
输出 “jbmgp”

代码

public static String encryption(String text,String encryp){
        StringBuilder sb = new StringBuilder();
        for(int i = 0;i < text.length();i++){
            int c = text.charAt(i) - 'a';
            int cur = encryp.charAt(i%encryp.length()) - '0'; //此处取模,加密字符串长度
            if(i%2 == 0){
                sb.append((char) ('a' + (c+cur)%26)); // + 强制类型转换为char,同样需要取模运算
            }
            else
                sb.append((char) ('a' + (c-cur)%26));// - 强制类型转换为char,同样需要取模运算
        }
        return sb.toString();
    }

时间复杂度: O(N)
空间复杂度: O(1)

题目三

给定两个数组,一个name = [“张三”,“李四”,“王五”]表示学生姓名,一个score = [“99,89,79,69”,“81,80,79,85”,“90,80,90,99”]分别表示三个人的各科成绩,要求输出三个人总成绩降序排列的姓名,即输出 res = [“张三”,“王五”,“李四”].
也就是先求出每个人的总成绩然后降序排列,输出对应人的姓名。

给定的例子:
输入:["张三""李四""王五"],
["99,89,79,69","81,80,79,85","90,80,90,99"]
输出:["张三","王五","李四"]

给定的函数:
class Solution{
	public String[] sort(String[] name,String[] score){
	
	}
}
 

算法思路 :可以看出本题其实就是要将每个人的字符串成绩相加,这里涉及字符串的拆分,转换为数字相加,然后排序,输出对应的人名。

  • 依次遍历score数组的每个字符串,用一个求和函数addSum求出总成绩存放进sum数组中;
  • addSum函数中,由于每个成绩由’,‘分割,以此为断点,将两个’,'之间的字符转换为数字;
  • 引入一个Map用于存放每个人的姓名和总成绩,以总成绩为键,姓名为值;
  • 然后将sum进行排序,依次对应的值加入res中即可。

代码

// "static void main" must be defined in a public class.
public class Main {
    public static void main(String[] args) {
        String[] name = {"张三","李四","王五"};  
        String[] score = {"99,89,79","81,80,79","90,80,90"};
        String[] res = new String[name.length];
        res = sort(name,score);
        for(int i = 0;i < name.length;i++)
            System.out.println(res[i]);
    }
    
    public static String[] sort(String[] name,String[] score){    
        String[] res = new String[name.length];
        int[] sum = new int[name.length];
        for(int i = 0;i < score.length;i++){
            sum[i] = addsum(score[i]);
        }
        Map<Integer,String> map = new HashMap<>();
        for(int i = 0;i < name.length;i++)
            map.put(sum[i],name[i]); //将总成绩和姓名一一对应
        Arrays.sort(sum);//sum排序,这里是升序
        for(int i = 0;i < name.length;i++)
            res[i] = map.get(sum[sum.length-1 - i]); //由于sum是升序的,所以从最后一个数开始将结果加入res
        return res;
    }
    
    public static int addsum(String s){
        int sum = 0;
        //可以用split()方法,即String[] score = s.split(',');
        String[] score = s.split(",");
        for(int i = 0;i < score.length;i++){
        //下面两种方法都可以将字符串转换为整型
            //sum += Integer.parseInt(score[i]);  
            sum += Integer.valueOf(score[i]).intValue();
        }
        return sum;
    }
}

复杂度
时间复杂度:O(N*N)
空间复杂度:O(N)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值