广发银行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);
}
}
-
复杂度分析:
-
时间复杂度:
- 其中 n 和 m 分别是字符串
x和y的长度,len 是乘积结果的长度。 - 需要注意的是,这里的 len 可能会比较大,因为乘积的结果可能很长。因此,最终的时间复杂度可以近似看作 O(n * m)。
- 其中 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. 解答分析
-
其实这一类题目直接看题模拟就行。
-
首先是判断当前的号码是否合法。
- 开头是否为
0或者是86,这里直接利用java的s.charAt(0)/s.charAt(1)判断即可。再判断完之后,将剩余的字符串保存,这里可以利用java的substring()进行截取,注意这个用法是前闭后开 - 号码的长度问题,需要不小于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);
}
}
-
复杂度分析:
-
时间复杂度:
,n就是手机号的长度。 -
空间复杂度:
-
所以说银行的题目较大厂的难度还是低一些,当然并不说明更容易进,还需要其余的知识补充。最近在看八股和计算机基础的知识,今年剩余的目标就是多维复习,刷题、八股、基础,还有做点项目出来。
慢慢来,🍞和🍬都会有的!加油💪!