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/
- REPL(Read-Eval-Print-Loop):应答式编程器?
- JShell:REPL 工具
- 改变
- 减少编程反馈时间
- 不需要分号
- 便捷网络访问:用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-枚举转换