页面启动中 . . .

广发银行1021秋招笔试


广发银行1021秋招笔试

前面写了很多互联网企业的秋招笔试,还算是比较有难度。这次来试试银行的题目,做完后发现很多都是经典模拟题,有边界的判断、特例的考虑,还算是比较简单。

1021.T1

1. 题目说明

37进制的规则为:“0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ$”输入两个37进制数字请输出二者相乘的结果。输入的数字位数,不超过999位。

输入
"Z","1"
输出
"Z"
输入
"A","B"
输出
"2$"

2. 解答分析

  • 主要考虑到此时的37进制下的A代表的是数字10,后续的字符也是以此类推。

  • 我们可以把两个字符串的每一位都拆开,模拟乘法的操作,只是此时需要注意好进位即可。

3. 具体代码

public class title1 {

    public int get(char ch) {
        return ch >= 'A' ? ch - 'A' + 10 : (ch == '$' ? 36 : ch - '0');
    }// 字符类型转化为整型

    public String mul37(String x, String y) {
        int n = x.length(), m = y.length();
        int len = n + m;
        int[] a = new int[len + 10];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {// 从后向前
                int ai = get(x.charAt(n - 1 - i));
                int aj = get(y.charAt(m - 1 - j));
                a[i + j] += ai * aj;	//将乘积加到当前位上
                a[i + j + 1] += a[i+j]/37; //进位
                a[i + j] %= 37;	//取模操作
            }
        }
        while (len>1 && a[len - 1] == 0)// 去除结果中的前导零,最多迭代 len 次,其中 len 是乘积结果的长度。
            len--;
        StringBuilder ans = new StringBuilder();
        for (int i = len - 1; i >= 0; i--) {
            char c;
            if (a[i] >= 10 && a[i] <= 35)
                c = (char) (a[i] - 10 + 'A');
            else if (a[i] == 36)
                c = '$'; //36位
            else
                c = (char) (a[i] + '0');
            ans.append(c);
        }
        return ans.toString(); //返回字符串
    }
    public static void main(String[] args){
        title1 title=new title1();
        String a="A";
        String b="B";
        String result=title.mul37(a,b);
        System.out.println(result);
    }
}
  • 复杂度分析:

    • 时间复杂度:O(nm+len)O(n*m+len)

      • 其中 n 和 m 分别是字符串 xy 的长度,len 是乘积结果的长度。
      • 需要注意的是,这里的 len 可能会比较大,因为乘积的结果可能很长。因此,最终的时间复杂度可以近似看作 O(n * m)。
    • 空间复杂度:O(n+m)O(n + m)

      • 这段代码的空间复杂度是O(n + m),其中n是字符串x的长度,m是字符串y的长度。

      • 除了数组a外,还创建了一个StringBuilder对象ans,用于构建最终的结果字符串。其空间复杂度可以忽略不计,因为它只是用于临时存储结果字符。

1021.T2

1. 题目说明

填写个人简历信息时,常常需要输入电话号码。当前的任务,需要根据输入的号码,判断属于哪个运营商(电信、移动、联通、广电)

为了简化问题,初定各运营商的号段如下:

  • 中国移动ChinaMobile拥有号码段为:139,138,137,136,135,134,147,159,158,157,151,152,150,182,188,187;16个号段
  • 中国联通ChinaUnicom拥有号码段为:130,131,132,145,155,156,186,185;8个号段
  • 中国电信ChinaTelecom拥有号码段为:133,1349,153,189,180:5个号码段
  • 中国广电ChinaBroadNet拥有号码段为190,197,196,192;4个号段

任务: 输入一个电话号码的字符串,判断该号码是否合法且为哪个运营商,若属于中国移动,则输出ChinaMobile

输入一个电话号码,可以以0开头或86开头,输出所属运营商或Invalid

输入
"013912345678"
输出
"ChinaMobile"
输入
"0139123456789"
输出
"Invalid"

2. 解答分析

  • 其实这一类题目直接看题模拟就行。

    • 首先是判断当前的号码是否合法。

      1. 开头是否为0或者是86,这里直接利用javas.charAt(0)/s.charAt(1)判断即可。再判断完之后,将剩余的字符串保存,这里可以利用javasubstring()进行截取,注意这个用法是前闭后开
      2. 号码的长度问题,需要不小于2和长度为11位(除去开头的判断字符)
    • 同时注意特例的判断,看到开头基本上都是三位数,只有一个1349是四位数,这个单独判断就行。

    • 最后就直接将后续的开头3位字符进行if-else的判断就行。

3. 具体代码

public class title2 {
    //思路:模拟。先判断长度是否合法,再根据前三位字符串判断即可
    public String getTypeOfMobilePhoneNumber(String mobilePhoneNumber){
        String s="";
        //先把特殊情况进行遍历吧,还有开头的字符
        if(mobilePhoneNumber.length()<=2){
            return "Invalid";
        }
        if(mobilePhoneNumber.charAt(0)=='0'){
            s=mobilePhoneNumber.substring(1);
        }else if(mobilePhoneNumber.charAt(0)=='8' && mobilePhoneNumber.charAt(1)=='6'){
            s=mobilePhoneNumber.substring(2);
        }
        if(s.length()!=11){
            return "Invalid";
        }if(s.substring(0,4).equals("1349")){
            return "ChinaTelecom";
        }
        String t=s.substring(0,3); //对后续的字符进行遍历判断
        if (t.equals("190") || t.equals("197") || t.equals("196") || t.equals("192"))
            return "ChinaBroadNet";
        else if (t.equals("133") || t.equals("153") || t.equals("189") || t.equals("180"))
            return "ChinaTelecom";
        else if (t.equals("130") || t.equals("131") || t.equals("132") || t.equals("145") || t.equals("155")
                || t.equals("156") || t.equals("186") || t.equals("185"))
            return "ChinaUnicom";
        else if (t.equals("139") || t.equals("138") || t.equals("137") || t.equals("136") || t.equals("135")
                || t.equals("134") || t.equals("147") || t.equals("159") || t.equals("158") || t.equals("157")
                || t.equals("151") || t.equals("152") || t.equals("150") || t.equals("182") || t.equals("188")
                || t.equals("187"))
            return "ChinaMobile";
        else
            return "Invalid";
    }
    public static void main(String[] args){
        title2 t=new title2();
        String mobilePhoneNumber="8613801234567";
        String result=t.getTypeOfMobilePhoneNumber(mobilePhoneNumber);
        System.out.println("Result: "+result);

    }

}
  • 复杂度分析:

    • 时间复杂度:O(n)O(n),n就是手机号的长度。

    • 空间复杂度:O(1)O(1)


  • 所以说银行的题目较大厂的难度还是低一些,当然并不说明更容易进,还需要其余的知识补充。最近在看八股和计算机基础的知识,今年剩余的目标就是多维复习,刷题、八股、基础,还有做点项目出来。

  • 慢慢来,🍞和🍬都会有的!加油💪!


文章作者: XKJ
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 XKJ !
  目录