阿里2021春招笔试题两题(带答案)

简介:  有一个字符串它的构成是词+空格的组合,如“北京 杭州 杭州 北京 上海”, 要求输入一个匹配模式(简单的以字符来写), 比如 aabb, 来判断该字符串是否符合该模式, 举个例子:

题目1.字符串匹配


 有一个字符串它的构成是词+空格的组合,如“北京 杭州 杭州 北京 上海”, 要求输入一个匹配模式(简单的以字符来写), 比如 aabb, 来判断该字符串是否符合该模式, 举个例子:


1.pattern = “abbac”, str=“北京 杭州 杭州 北京 上海” 返回 ture

2.pattern = “aacbb”, str=“北京 北京 上海 杭州 北京” 返回 false

3.pattern = “baabcc”, str=“北京 杭州 杭州 北京 上海 上海” 返回 ture


public class Solution {
    public boolean wordPattern(String pattern, String str) {
    }
}

我的答案:

package exam;
import java.util.HashMap;
import java.util.Map;
public class Solution {
    // pattern = "abbac", str="北京 杭州 杭州 北京 上海" 返回 ture
    public boolean wordPattern(String pattern, String str) {
        Map<Character, String> map = new HashMap<>();
        String[] strs = str.split(" ");
        if(pattern.length() != strs.length){
            return false;
        }
        int n = pattern.length();
        for(int i = 0; i < n; i ++){
            char c = pattern.charAt(i);
            String temp = strs[i];
            if(!map.containsKey(c) && !map.containsValue(temp)){
                map.put(c, temp);
            }else{
                if(!temp.equals(map.get(c))){
                    return false;
                }
            }
        }
        return true;
    }
    public static void main(String[] args) {
        Solution s = new Solution();
//        String pattern = "abbac";
//        String str = "北京 杭州 杭州 北京 上海";
//        String pattern = "aacbb";
//        String str = "北京 北京 上海 杭州 北京";
        String pattern = "aabb";
        String str = "北京 北京 北京 北京";
        System.out.println(s.wordPattern(pattern, str));
    }
}


 这里要感谢读者qq_36922084的提醒,上一版代码是通过不了所有的测试用例的,因为没有考虑map中会重复添加相同的value,而这些value恰恰可能是对应不同的key,举个例子:如果输入 str = "北京 北京 北京 北京"和parten = "aabb"的话,原本的代码会输出一个true,但这显然是错误的,现已纠正,在判断!map.containsKey(c)的同时加入!map.containsValue(temp)即可,保证集合中的键值对不重复。


题目2.接口限流实现


 有一个API网关,出于对API接口的保护,需要建立一个流控功能,根据API名称,每分钟最多只能请求指定的次数(如1000次),超过限制则这分钟内返回错误,但下一分钟又可以正常请求。


public class API {
    /*
    超时时间
     */
    private long time;
    /*
    请求API的次数
     */
    private int count;
    public long getTime() {
        return time;
    }
    public void setTime(long time) {
        this.time = time;
    }
    public int getCount() {
        return count;
    }
    public void setCount(int count) {
        this.count = count;
    }
    public boolean isValid(){
        System.out.println(System.currentTimeMillis()/1000);
        // 没有超时
        if(System.currentTimeMillis()/1000 < time){
            if(this.count < 10){
              // 请求小于10次则表示请求成功(为了测试方便没有设为题意的1000)
                this.count ++;
                System.out.println("执行成功");
                return true;
            }else{
                System.out.println("请求超出1000次,失败");
                return false;
            }
        }else{
          // 触发限流则重置
            System.out.println("----------重置----------");
            this.count = 1;
            this.setTime(System.currentTimeMillis()/1000 + 1);
            return true;
        }
    }
}


import javax.sound.midi.Soundbank;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
 * 2 * @Author: 小王同学
 * 3 * @Date: 2021/3/3 16:12
 * 4
 */
public class UseApi {
  /*
  * 用一个map来记录请求的名字和频次
  */
    private static Map<String, API> map = new HashMap<>();
    public boolean invoke(String name){
        if (name.isEmpty()){
            return false;
        }
        synchronized (map){
            System.out.println(map.containsKey(name));
            // 第一次请求该命令
            if(!map.containsKey(name)){
                API api = new API();
                api.setTime(System.currentTimeMillis()/1000 + 1);
                api.setCount(1);
                map.put(name, api);
                return true;
            }else{
                API api = map.get(name);
                return api.isValid();
            }
        }
    }
  // 测试方法,线程里面请求10次同一个方法 method1
    public static Runnable getThread(){
        return new Runnable() {
            @Override
            public void run() {
                for(int i = 0; i < 10; i ++){
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    UseApi useApi = new UseApi();
                    System.out.println(useApi.invoke("method1"));
                }
            }
        };
    }
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
    // 开10个线程进行测试
        for (int i = 0; i < 10; i++) {
            executorService.submit(getThread());
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        executorService.shutdown();
    }
}


关于这个1分钟计时的方法应该还有更好的,欢迎大家留言分享~

相关文章
|
设计模式 存储 算法
整理牛客网 ----- 阿里校招 Java 后端 1-5 面 + HR 面面经
整理牛客网 ----- 阿里校招 Java 后端 1-5 面 + HR 面面经
697 0
整理牛客网 ----- 阿里校招 Java 后端 1-5 面 + HR 面面经
|
存储 负载均衡 监控
分布式定时任务,你了解多少?基于Quartz实现分布式定时任务解决方案!
定时任务系统在应用平台中的重要性不言而喻,特别是互联网电商、金融等行业更是离不开定时任务。在任务数量不多、执行频率不高时,单台服务器完全能够满足。但是随着业务逐渐增加,定时任务系统必须具备高可用和水平扩展的能力,单台服务器已经不能满足需求。因此需要把定时任务系统部署到集群中,实现分布式定时任务系统集群。
5861 1
分布式定时任务,你了解多少?基于Quartz实现分布式定时任务解决方案!
|
Java 编译器
【Java基础面试三十】、 两个字符串相加的底层是如何实现的?
这篇文章解释了Java中两个字符串相加的底层实现:对于字符串直接量的拼接,编译器在编译时会进行优化合并;而对于包含变量的字符串拼接,编译器会采用`StringBuilder`进行优化,自动创建实例并调用`append()`方法来拼接字符串。
|
12月前
|
算法 测试技术 持续交付
面试的流程,面试的重点
本文介绍了面试流程及各轮面试的重点。通常面试为1-5轮,首轮关注技术实力与项目经验,次轮深入考察技术细节,第三轮侧重项目协调、创新及价值观等软性问题,如职业规划和沟通能力。面试题分为开放型(如项目经验、解决问题思路)和非开放型(如技术细节、手撕算法),需提前准备。测试类问题涉及自动化测试、持续集成等实际应用。
|
8月前
|
人工智能 自然语言处理 达摩院
通义大模型:中国AI领域的新里程碑
本文介绍了阿里巴巴达摩院研发的“通义大模型”系列,该模型在2025年已成为AI领域的重要里程碑。通义大模型拥有超大规模参数、多模态融合、高效训练框架和中文优化等技术特点,在智能客服、内容创作、教育和企业服务等多个场景实现应用。未来,它将在多模态能力、小样本学习、安全性及应用场景拓展等方面持续突破,推动中国AI技术进步与行业智能化转型。
2609 18
|
监控 NoSQL MongoDB
【MongoDB 专栏】MongoDB 查询优化技巧
【5月更文挑战第10天】本文探讨了MongoDB查询优化技巧,包括合理使用索引、优化查询语句、数据模型简化、避免全表扫描、选择合适查询方法及监控性能。通过案例分析展示了优化策略及其效果,强调了持续优化对提升数据库性能和用户体验的重要性。掌握这些技巧能有效挖掘MongoDB的潜力。
579 2
【MongoDB 专栏】MongoDB 查询优化技巧
|
存储 JavaScript API
Vue3实现图片懒加载及自定义懒加载指令
Vue3实现图片懒加载及自定义懒加载指令
1273 0
|
SQL 关系型数据库 MySQL
MySQL EXPLAIN该如何分析?
本文将详细介绍MySQL中`EXPLAIN`关键字的工作原理及结果字段解析,帮助优化查询性能。`EXPLAIN`可显示查询SQL的执行计划,其结果包括`id`、`select_type`、`table`等字段。通过具体示例和优化建议,帮助你理解和应用`EXPLAIN`,提升数据库查询效率。
632 1
|
IDE 网络安全 开发工具
IDE之vscode:连接远程服务器代码(亲测OK),与pycharm链接服务器做对比(亲自使用过了),打开文件夹后切换文件夹。
本文介绍了如何使用VS Code通过Remote-SSH插件连接远程服务器进行代码开发,并与PyCharm进行了对比。作者认为VS Code在连接和配置多个服务器时更为简单,推荐使用VS Code。文章详细说明了VS Code的安装、远程插件安装、SSH配置文件编写、服务器连接以及如何在连接后切换文件夹。此外,还提供了使用密钥进行免密登录的方法和解决权限问题的步骤。
5538 0
IDE之vscode:连接远程服务器代码(亲测OK),与pycharm链接服务器做对比(亲自使用过了),打开文件夹后切换文件夹。
高频面试题:如何分别用三种姿势实现三个线程交替打印0到100
高频面试题:如何分别用三种姿势实现三个线程交替打印0到100