ARTS
Algorithm:每周至少做一个leetcode的算法题;
Review:阅读并点评至少一篇英文技术文章;
Tip/Tech:学习至少一个技术技巧;
Share:分享一篇有观点和思考的技术文章;
Algorithm
763. 划分字母区间
https://leetcode-cn.com/problems/partition-labels/submissions/
public List<Integer> partitionLabels(String S) {
if (S == null || S.length() == 0) {
return null;
}
int[] letterLastOriginal = new int[26];
char[] letterArray = S.toCharArray();
List<Integer> returnList = new LinkedList<>();
int lengthLetterArray = letterArray.length;
for (int i = 0; i < lengthLetterArray; i++) {
letterLastOriginal[(int) letterArray[i] - 97] = i;
}
Set<Character> charSet = new HashSet<>();
int leftBorder = 0;
int firstCharInt = (int) letterArray[0] - 97;
int rightBorder = letterLastOriginal[firstCharInt];
for (int i = 0; i < lengthLetterArray; i++) {
if (charSet.contains(letterArray[i])) {
if (i == rightBorder) {
returnList.add(rightBorder - leftBorder + 1);
leftBorder = i + 1;
if (i != lengthLetterArray - 1) {
rightBorder = rightBorder = letterLastOriginal[(int) letterArray[i + 1] - 97];
}
charSet.clear();
}
} else if (charSet.size() == 0) {
if (i == rightBorder) {
returnList.add(rightBorder - leftBorder + 1);
leftBorder = i + 1;
if (i != lengthLetterArray - 1) {
rightBorder = rightBorder = letterLastOriginal[(int) letterArray[i + 1] - 97];
}
} else {
charSet.add(letterArray[i]);
}
} else {
if (rightBorder < letterLastOriginal[(int) letterArray[i] - 97]) {
rightBorder = letterLastOriginal[(int) letterArray[i] - 97];
}
charSet.add(letterArray[i]);
}
}
return returnList;
}
这道题主要先遍历一遍,把26个字母的对应的最大的索引的值记录下来,放到一个数组中,数组26元素,记录每个字母的在数组中的最右边的元素所在的索引值。
接着再次遍历第二遍,我们先假设这些最短的字母区间从第一个字母开始的,所以设置一个左边界(左指针)的索引值为先开始的值0。接着把每次走过的字母都放到set集合中,并且判断他们遍历过的字母中的最右边的元素的最大值,这个值就是右指针了。判断遍历的的坐标是否等于右指针,如果等于右指针的话,说明这个区间就是我们想找的字母划分的区间。
Review
如何高效率的输出所有二叉树里的点?
https://www.techiedelight.com/print-nodes-between-two-levels-binary-tree/
本周的技术文章讲的是如何用队列来输出所有二叉树里面的点。
这里要用到队列这种数据结构。
在这段时间里主要用业余的时间来反复学习了算法。学了算法不免的学到数据结构。一般你要懂得数据结构里面什么是什么。
what?
比如队列是啥?栈是啥?是什么的问题,主要是解决这个数据结构有什么特性,比如插入,更新、查询 分别的时间复杂度是多少?
how?
接着就是如何实现的这个数据结构了。比如队列这种数据结构既可以用数组来实现,又可以用链表来实现,具体的实现的方式可以说是很多种了。接着又数据搬移的实现不够高级,接着你可以学习循环队列的实现,如何判断这个循环队列已满,已空,这又是有研究的,比如可以取模计算,比如可以设置一个size值,记录当前的已经存了多少的数据了。
why?
知道如何实现,就是去思考那些场景下使用队里了。这个基本没啥好的办法,基本就是靠找题目,刷题目了。
这篇博文讲的就是如何去用队列来实现输出所有的二叉树中的元素,有伪代码,有实现的代码。听通俗的,挺好。
Tip/Tech
循环队列的实现。
Share
https://spectrum.ieee.org/tech-talk/computing/software/fujitsu-plans-to-support-professional-judges-with-lidar-and-ai-at-gymnastics-meets
富士通计划在体操比赛中用激光雷达和人工智能支持专业评委
简单来说这篇文章说的就是,因为平时体操的裁判的主观因素导致选手得到不公平的分数,所以就有了这种解决方案,用科技的手段来辅助裁判,说是辅助,但是到时候,科技的水平上去了,肯定是要比裁判来的更加准确的。
我们常常说随着人工智能的到来,有很多行业都面临着改变,开始人们认为是流水线上的工人,接着是司机这些行业的,但是现在看来比如说裁判也会被代替,而且时间会很快,比如上一届的世界杯用了新的技术来改判的结果一点不少,我们假设有足够多的摄像机来捕捉画面,那么根据数据的计算出来的结果肯定是要比人工的判断来的更加的精确的。
也许不远的将来我们将看到人工智能的裁判在球场上举起一张黄牌,当选手有异议的时候,天花板上的大屏幕就会不断的重复播放他的犯规的动作,每个犯规的动作都会被一个个红色的圈给标注出来,直接导致选手哑口无言。