写点什么

ARTS 打卡 Week 11

用户头像
teoking
关注
发布于: 2020 年 08 月 24 日
ARTS打卡Week 11

每周完成一个 ARTS:

Algorithm: 每周至少做一个 LeetCode 的算法题

Review: 阅读并点评至少一篇英文技术文章

Tips: 学习至少一个技术技巧

Share: 分享一篇有观点和思考的技术文章



Algorithm

LC 3. Longest Substring Without Repeating Characters

class Solution {
// Time : O(n*n)
// Space: O(n)
public int lengthOfLongestSubstringMy(String s) {
if (s == null) {
return 0;
}
if (s.length() <= 1) {
return s.length();
}
HashMap<Character, Integer> map = new HashMap<>();
char[] chars = s.toCharArray();
int maxLen = 0;
int len = 0;
for (int i = 0; i < chars.length;) {
char c = chars[i];
if (map.containsKey(c)) {
i = map.get(c) + 1;
maxLen = Math.max(maxLen, len);
// O(n) opt
map.clear();
len = 0;
} else {
map.put(c, i);
len++;
i++;
}
}
return Math.max(maxLen, len);
}
// 一个非常快的解法
// Time : O(log(n))
// Space: O(1)
public int lengthOfLongestSubstring(String input) {
if(input.length() <= 1) {
return input.length();
}
char[] inputChars = input.toCharArray();
int result = 0;
int startIndex = 0;
int size = inputChars.length;
for(int i = 1; i < size; i++) {
char c = inputChars[i];
for(int j = startIndex; j < i; j++) {
if(inputChars[j] == c) {
int max = i - startIndex;
if(max > result)
result = max;
startIndex = j + 1;
break;
}
}
}
int len = input.length() - startIndex;
return Math.max(len, result);
}
}



Review

https://code.tutsplus.com/tutorials/smooth-freehand-drawing-on-ios--mobile-13164

这篇文章虽然是2012年写的,但是其对“手指作画”这个功能的实现和一步一步改进,条理清晰,很值得看。

第一步,使用iOS平台的贝塞尔曲线函数(path)来实现最基本的作画功能,代码实现可参见原文,其效果如下:

第二步,作者进行了绘制cache优化,以及贝塞尔曲线优化(当生成一个贝塞尔曲线时,前一个曲线的endpoint作为startpoint,加入control点;同时还讲了下贝塞尔曲线的定义),效果如下:

第三部,针对上面效果图中曲线切线不匹配问题:引入更多点来确定一条曲线的control point;最终效果:



Android Dynamic Feature Modules : The Future

这边文章介绍了谷歌play service于2018年随AAB(Android Application Bundle)推出的能力之一:动态分发。其工作过程如上图所示,app按需加载所需要的功能。

简单来理解,这个功能就是官方版的“插件化”:开发者开发好功能,定义好split规则,google play按照规则切割aab为多个apk,客户端使用SplitInstallManager实现功能的按需下载。

适用Android版本为5.0以上。

其实在安卓比较早的时代,已经有开发者实现过类似场景,比如Go Contracts, Go Contact Theme这种,是通过提交多个apk到google play,然后自己实现下载引导、安装等。现在这些功能由play提供,开发者就更方便了。(同时也能避免插件化库兼容性问题)



Tips

前段时间在iOS开发中,想实现了一个UIScrollView + masonry可以根据内容高度滚动的场景,当时调代码调了大半天,翻遍SO和国内几个论坛,代码没找出来什么问题。这几天又抽时间看了下这个问题,最后不得不采用穷举调试法,找到了问题代码和解决方案,见如下代码注释:

@implementation VTMainPageView
- (id)init {
self = [super init];
if (!self) return nil;
[self generateContent];
return self;
}
- (void)generateContent {
[self generateHeaderView];
// Init base scroll view
UIScrollView *scrollView = UIScrollView.new;
self.scrollView = scrollView;
[self.scrollView setShowsVerticalScrollIndicator:NO];
[self.scrollView setShowsHorizontalScrollIndicator:NO];
[self addSubview:scrollView];
[self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.headerView.mas_bottom).offset(30.0);
make.leading.trailing.bottom.equalTo(self);
}];
UIView *contentView = [[UIView alloc]init];
self.contentView = contentView;
[self.scrollView addSubview:contentView];
[contentView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.scrollView);
make.width.equalTo(self.scrollView);
}];
// feature view <- template view <- banner view
// 这三个view中,后一个view的top要顶住上一个view的bottom
[self generateFeatureView];
[self generateTemplateView];
[self generateBannerView];
// Workaround:添加offset(50),就可以解决ScrollView使用AutoLayout布局时不滑动问题
[contentView mas_makeConstraints:^(MASConstraintMaker *make) {
make.bottom.mas_equalTo(self.bannerView.mas_bottom).offset(50);
}];
}
@end



Share

Cartoonize: 可将视频、图片一键卡通化的开源工具

对于视频、图片编辑app来说,离线处理有可能是个亮点。

用户头像

teoking

关注

Monkey plays software. 2018.11.28 加入

程序员。目前主要从事Android和iOS开发。

评论

发布
暂无评论
ARTS打卡Week 11