阿里4.7笔试第一、二题
第一题14' AC
题目描述
给一个数,但不确定这个数的进制,只知道可能是2~16进制的其中之一,要求算出所有可能的结果,并转成十进制后对10E9+7进行取模,把所得到的答案从小到大排列,若存在相同的结果,只保留一个即可。
输入描述:
一个数,表示得到的数字
保证不会出现’0'~'9',‘A'~’F’以外的字符,输入数字长度不超过100000,且保证无前导零。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
int mn = 2;
int n = s.length();
Set set = new TreeSet();
for (int i = 0; i < n; ++i) {
char c = s.charAt(i);
if (Character.isDigit(c)) {
mn = Math.max(mn, c - '0' + 1); // 最小的进制是多少
} else {
mn = Math.max(mn, 10 + c - 'A' + 1);
}
}
int mod = 1000000007;
for (int jz = mn; jz <= 16; jz++) {
long num = 0;
long t = 1;
for (int i = n - 1; i >= 0; --i) {
char c = s.charAt(i);
long cur = 0;
if (Character.isDigit(c)) {
cur = (c - '0') * t;
} else {
cur = ((c - 'A') + 10) * t;
}
num = (num + cur) % mod;
t = (t * jz) % mod;
}
set.add(num);
}
for (long x : set) {
System.out.println(x);
}
}
} 第二题16',没来得及看到最后的结果(不保证AC)
题目描述
对2021年的账单进行一次总结。
输入描述:
输入共包含24行:
第一行输入:"January:x",代表1月的账单明细数量。
第二行输入 x 个账单明细。每个账单明细用空格隔开。账单明细的格式是 s:a[i],其中 s为长度不超过10的、只包含小写字母的字符串,代表该明细的名称,a[i]为绝对值不超过10^5的非零浮点数(a[i]均有2位小数,前面有正负号,正号代表收入、负号代表支出)。
第三行输入:"February:x",代表2月的账单明细数量。后面以此类推。
x的范围是1-100闭区间。
输出描述:
首先输出每个月的结余,共12行,形式是: s:x,其中 s 是月份名字,x 为总结余(x均保留2位小数,前面有正负号。若结余是0.00,前面也需要加上’+’字符)
最后一行输出两个月份,分别代表总支出最大的月和总收入最大的月。如果有多个月份最大,输出更靠前的那个月。保证至少存在一个月有收入,至少存在一个月有支出。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double mn = Double.MAX_VALUE;
String mnName = "";
double mx = Double.MIN_VALUE;
String mxName = "";
for (int i = 0; i < 12; ++i) {
String mon = sc.next();
int mh = mon.indexOf(':');
String name = mon.substring(0, mh);
int n = Integer.valueOf(mon.substring(mh + 1, mon.length())); // 个数
double sum = 0.0;
double zhichu = 0.0;
double shouru = 0.0;
for (int j = 0; j < n; ++j) {
String cost = sc.next();
mh = cost.indexOf(':');
double p = Double.valueOf(cost.substring(mh + 2, cost.length() - 1));
if (cost.charAt(mh + 1) == '+') {
sum += p;
shouru += p;
} else {
sum -= p;
zhichu -= p;
}
}
// System.out.println(shouru);
// System.out.println(zhichu);
if (shouru > mx) {
mxName = name;
mx = shouru;
}
if (zhichu < mn) {
mnName = name;
mn = zhichu;
}
if (sum >= 0) {
System.out.printf(name + ":+%.2f\n", sum);
} else {
System.out.printf(name + ":%.2f\n", sum);
}
}
System.out.println(mnName + " " + mxName);
}
}第三题 30'(没时间做了)
题目描述
一个仅包含小写字母的字符串,希望删除其中一个非空连续子串,使得剩下的字符串至少有k种不同字母。
问有多少种不同的删除方案?注:若删除的子串位置不同,则视为两种不同的方案。
输入描述:
第一行输入两个正整数 n 和k,代表字符串的长度以及最终字符串的字母种类最小值。
一个长度为n的只包含小写字母的字符串s。(保证至少k种字符)
1<n<200000
1 <= k <= 26
输出描述:
一个整数,代表删除子串的方案数。
#阿里笔试##实习##笔试题目##Java##阿里巴巴#