阿里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##阿里巴巴#
全部评论
没给pow的值取模😂9%
2 回复 分享
发布于 2022-04-07 22:35
第一题go有现成的库可以调用SetString(str,base),import math/big 然后先z:=NewInt(0),然后z.SetString(input,16)就可以直接把输入的字符串input转化成16进制的数了,再直接打印即可!
1 回复 分享
发布于 2022-04-08 15:08
删数的是这么做的么? #include<iostream> #include<set> using namespace std; set<int> s; const int N = 1e4+10; int main() {     int n ;     cin>>n;     while (n--) {         int c;         cin>>c;         if(s.find(c) == s.end()) {             s.insert(c);         }         else {             s.erase(c);             int x  = c<<1;             while(s.find(x) != s.end()){                 x<<1;             }             s.insert(x);                      }     }     cout<<*s.rbegin()<<endl;           }
点赞 回复 分享
发布于 2022-04-07 22:45
题目是啥啊
点赞 回复 分享
发布于 2022-04-07 23:36
第一题以为最后结果取余,原来每次都要取余,沃日
点赞 回复 分享
发布于 2022-04-08 09:21
求第二题c++版本答案
点赞 回复 分享
发布于 2022-04-08 10:03

相关推荐

09-29 11:19
门头沟学院 Java
点赞 评论 收藏
分享
11-07 13:31
怀化学院 Java
勇敢牛牛不怕难:又疯一个
点赞 评论 收藏
分享
10 39 评论
分享
牛客网
牛客企业服务