阿里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##阿里巴巴#