ARTS第一周

算法

 

工作好多年,脱离算法数据结构好多年,简单的题目对于我来说也是有点无从下手,从简单开始一步步来吧。 begin:两数之和 给定一个整数数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案,但是你不能重复利用这个数组中同样的元素。

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

第一个闪现的就是 遍历数组后 使用 target的数A减去当前遍历值B后得到需要的值c,再遍历数组是否存在 和 c相等的值, 相等 则获取 b和c的 遍历下标。 class Solution { public int[] twoSum(int[] nums, int target) { int[] ceshi = new int[2]; for(int i = 0 ;i<nums.length;i++ ){ int numTemp1 = target - nums[i]; for(int j = 0;j<nums.length;j++){ if(nums[j] != nums[i] && nums[j] == numTemp1){ ceshi[0] = i; ceshi[1] = j; return ceshi; } } } return ceshi; } } 遍历两次数组找到对应的 数,耗费O(n^2); 遍历两次数组找到对应的 数,耗费O(n^2);

第二种:目前需要找到 下标和值的对应 class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer,Integer> mapTemp = new HashMap<>(); for(int i = 0 ;i<nums.length;i++){ mapTemp.put(nums[i],i); } for(int i = 0;i<nums.length;i++){ int value = target - nums[i]; if(mapTemp.containsKey(value) && mapTemp.get(value) != i){ return new int[]{i,mapTemp.get(value)}; } } return null; } }

第三种: class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer,Integer> mapTemp = new HashMap<>(); for(int i = 0;i<nums.length;i++){ int value = target - nums[i]; if(mapTemp.containsKey(value) && mapTemp.get(value) != i){ return new int[]{i,mapTemp.get(value)}; } mapTemp.put(nums[i],i); } return null; } }

使用第一种解法时间复杂度要高于后面两种。

后期会增加 时间复杂度和空间复杂度分析

 

英文阅读

 

英文引用地址:https://www.joelonsoftware.com/2018/05/03/announcing-stack-overflow-for-teams/

学习英语,阅读英文资料 第一篇

离开学校好多好多年,之前自测了下现在词汇量大概就是 准备高考的水平,想当初还好不容易考过了六级,荒废太多。从头开始吧加油

从网络上推荐的博客中找到了Joel Spolsky,从大神的博客中找了一篇作为第一篇阅读.

这篇文章主要是介绍一个收费的 回答问题的项目 Stack Overflow for Teams

文章主要推荐团队可以使用Stack overflow,这样即可以构建自己的知识库,也可以 及时的得到帮助 并且 帮助团队中的其他人。

在Stack overflow中你发布问题时,你可以私下询问团队中人或者整个网络中人,界面中可以设置 是 私下发布还是公开发布,或者你可以指定某个人的名字向他提问。

而且这个问题得到解决时解决方案会使用绿色的框圈起来,这样就不需要继续回答这个问题,所以搜索时基本上问题和答案都是完整的,不会出现一般论坛那样 对于问题不知道正确的答案是什么。

后面可以推荐团队试试这个工具,但是收费的话阻碍比较大。

下次选择个技术的英文文章看下。

 

技术学习

 

之前工作中遇到需要了解arp的地方,参考网上的一些信息分享下面的内容

ARP协议

ARP(Address Resolution Protocol)即地址解析协议,用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址。

在网络通信中,主机和主机通信的数据包需要依据OSI模型从上到下进行数据封装,当数据封装完整后,再向外发出。所以在局域网的通信中,不仅需要源目IP地址的封装,也需要源目MAC地址的封装。

一般情况下,上层应用程序更多关心IP地址而不关心MAC地址,所以需要通过ARP协议来获知目的主机的MAC地址,完成数据封装。

【ARP协议字段解读】

Hardware type :硬件类型,标识链路层协议

Protocol type: 协议类型,标识网络层协议

Hardware size :硬件地址大小,标识MAC地址长度,这里是6个字节(48bti)

Protocol size: 协议地址大小,标识IP地址长度,这里是4个字节(32bit)

Opcode: 操作代码,标识ARP数据包类型,1表示请求,2表示回应

Sender MAC address :发送者MAC

Sender IP address :发送者IP

Target MAC address :目标MAC,此处全0表示在请求

Target IP address: 目标IP

 

在ARP应答信息里面,除了IP地址和MAC信息,我们还能看到相关的设备厂商信息,例如cisco、meizu、apple、xiaomi等,这其实就是依靠MAC地址前面24位的OUI(机构唯一标识符)来识别的。

1、

A向B发送信息时(同一个网段),需要添加源MAC地址和目标MAC地址。A会先查询自己的ARP缓存表是否存在B对应ARP表项。如果找到对应的MAC地址则直接利用ARP表中的MAC地址对IP数据包进行帧封装。

如果A找不到对应的MAC地址,则缓存该数据报文,然后发送一个ARP请求的广播包。

B收到ARP请求后比较自己的IP地址和ARP请求中的目标IP地址,相同时则将ARP请求报文中的主机A的IP地址和MAC地址存入自己的ARP表中,并发送ARP响应报文给A.

A收到响应后将B的MAC地址加入自己的ARP表中。

2、

当主机A和主机B不在同一网段时,主机A就会先向网关发出ARP请求,ARP请求报文中的目标IP地址为网关的IP地址。当主机A从收到的响应报文中获得网关的MAC地址后,将报文封装并发给网关。如果网关没有主机B的ARP表项,网关会广播ARP请求,目标IP地址为主机B的IP地址,当网关从收到的响应报文中获得主机B的MAC地址后,就可以将报文发给主机B;如果网关已经有主机B的ARP表项,网关直接把报文发给主机B。跨网段通信时,发送方请求得到的目标MAC地址都是网关MAC。

ARP攻击:

A发起ARP查询B,正常情况下如果其他主机收到的arp不是自己的直接丢弃,如果网络中存在某个主机C安装了ARP攻击软件或遭受ARP病毒,成为这个网络的攻击者(hacker)。则C收到arp后会发起ARP回应包(B:IPàC:MAC)。

A会收到两个ARP回应包:B:IPàB:MAC,B:IPàC:MAC。

A会选最新的(也就是后到优先)。

这样A本来要发给B的数据包会发给C。B中的arp表也可能同样被C进行欺骗。这样A和B的通信都被C拦截,形成了典型的中间人攻击

 

文章分享

 

后面自己之前是 从来不写博客什么的,别人让写个文档特别头痛,不知道怎么表达。

分享这篇文章从现在做起!

文章链接:https://www.cnblogs.com/zhaopei/p/why_write_blog.html

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值