ARTS-Week1

Algorithm

题目

给定一个整数数组 nums和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum

第一个解

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] result = new int [] {0,0};
        for(int i=0;i<nums.length-1;i++){
            for(int j=i+1;j<nums.length;j++){
                if(nums[i]+nums[j] == target){
                    result[0] = i;
                    result[1] = j;
                    return result;
                }
            }
        }
        return result;
    }
}

方法总结

很简单的一个功能,脑袋里面第一时间的想法。事后总结,这只能算一个码农级别的解法。

执行效果

执行用时 :46 ms, 在所有Java提交中击败了44.75%的用户
内存消耗 :35.8 MB, 在所有Java提交中击败了97.76%

看到内存消耗和执行时间,很容易想到用空间换时间的办法来优化。很可惜的是,自己陷在第一个解法的思维里面,跳不出来。或者说,根本想不到。

第二个解

带着疑惑,看了官方的答案,第一个和自己的一样。第二个就是打击到我了,根本没有想到用HashMap来转换值和序列的关系,总是想这要减少时间,但是又想不到用操作时间复杂度是O(1)的HashMap的get来做!后续查询了下,这个几乎是常规操作,貌似在《疯狂Java讲义》里面有提到。

class Solution {
    public static int[] twoSum(int[] nums, int target) {
		Map<ArrayList<Integer>, Integer> map = new HashMap<>();
		for (int i = 0; i < nums.length; i++) {
			ArrayList<Integer> key = new ArrayList<>();
			key.add(nums[i]);
			key.add(target - nums[i]);
			Collections.sort(key);
			System.out.println(key);
			if (i!=0 && map.containsKey(key) && nums[i]+nums[map.get(key)]==target) {
				return new int[] { i, map.get(key) };
			} else {
				map.put(key, i);
			}

		}
		throw new IllegalArgumentException("No two sum solution");
	}
}

方法总结

属于自己用力过猛的解法!因为只看了官方中的两遍Hash的解法,想自己写出一遍的解法,最后又了这个解法。但是实际上自己有想过在两遍Hash的方法中找一遍Hash的解法,但是自认为不可能!呵呵。

一遍Hash答案

class Solution {
    public int[] twoSum(int[] nums, int target) {
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        int complement = target - nums[i];
        if (map.containsKey(complement)) {
            return new int[] { map.get(complement), i };
        }
        map.put(nums[i], i);
    }
    throw new IllegalArgumentException("No two sum solution");
}

}

总结

List和HashMap的映射关系转换,可以让查询更加快速,便捷。

Review

https://programtalk.com/java/jshell-java-9-repl/

  1. REPL(Read-Eval-Print-Loop):应答式编程器?
  2. JShell:REPL 工具
  3. 改变
    • 减少编程反馈时间
    • 不需要分号
    • 便捷网络访问:用JShell连接远程服务器,操作数据库。省去安装XShell工具?
    • 保存和加载工作空间:列出代码可用函数和变量的命令。鸡肋?
    • JShell没有异常抛出,都会被后台处理。
    • JShell API:方便扩展,方便给IDE集成使用
    • 变量的初始化,有提示信息

Tip

Docker镜像导入导出

一、准备

1.1 安装docker

在一台虚拟机或实体机中安装docker,可参考:安装docker

1.2 配置私服Nexus信息

在/etc/docker中找到daemon.json文件,没有则创建。添加私服司nexus信息:

{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
  "insecure-registries": ["192.168.126.96:8098"]
}

1.3 重启docker

重启docker,生效配置

systemctl daemon-reload
systemctl restart docker

二、拉取镜像

docker pull 192.168.126.96:8098/{image-name}:{tag}

三、导出镜像

导出镜像,到/abc目录下,文件名为:{file-name}.tar

docker sava -o /abc/{file-name}.tar {image-name}:{tag}

四、导入镜像

复制导出的镜像文件到需要部署的机器,导入镜像到docker。在部署机器中运行镜像

docker load < /root/{file-name}.tar
或者
docker load -i {file-name}.tar

五、Push镜像

docker tag 192.168.126.96:8098/{image-name}:{tag} remote-ip:port/{image-name}:{tag}
docker push remote-ip:port/{image-name}:{tag}

Share

参与改进了下:
mybatis-枚举转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值