转载于Github技术清谈
1【问题】【算法】缓存操作进行优化的措施中,有没有迎合用户“喜旧厌新”的算法技巧,可谓是缓存界的“断舍离”算法?也即:那些过去经常被访问的,将来也很可能被访问,优先级提高。那些长时间不被访问的,直接删了就好。描述下算法的实现原理。给出工作中至少两个使用场景。
【答案】LRU彻汰策略,应用场景比如iOS的两个常用库:Lottie、YYCache。
2 【问题】【在IM开发中】app 接收到一个message,上层UI刷新一次,要求考虑到CPU和电量消耗,解决短时间内接收到很多条消息的问题。怎么解决?有几种方案?
方案一:利用联结(在异步线程上调用dispatch_source_merge_data后,就会执行 dispatch source 事先定义好的handler)、DISPATCH_SOURCE_TYPE_DATA_ADD,将刷新UI的工作拼接起来,短时间内做尽量少次数的刷新。
方案二:自己实现队列、确定一个合适的时间阈值,在阈值时间到达时、主动取消息或者被动接受消息,最后刷新UI,达到消息限流的作用。举例:假设我们消息的获取都是通过长连接推送过来的,而不是主动拉取的。可以用消息队列来做,消费者定期去队列取数据进行数据展示。
或者假设前一条 消息和后一条消息间隔只在0.2s以内,就可以认为是频繁收到消息。然后把这0.2s内的消息刷新相关操作,比如做个动画效果。
3 描述:如图label1在containerView上,containerView、label2在cell.contentView上。问题:label1与label2的字数不固定,需求是,无论label2字数多少,label1都不能被拉伸或者压缩:

【答案】需要给label1设置一下优先级,设置平行的的Content compression resistance priority。
系统 Autolayout 参考 :
Masonry 参考以下属性:
static const MASLayoutPriority MASLayoutPriorityRequired = UILayoutPriorityRequired;
static const MASLayoutPriority MASLayoutPriorityDefaultHigh = UILayoutPriorityDefaultHigh;
图形化操作见以下动图:
https://user-images.githubusercontent.com/2911921/57424621-dc427500-724a-11e9-93b3-1b29549a41e8.gif
4 【计算机常识】如果你一直在用GitLab开发,现在公司要切换到GitHub开发,可以两个邮箱不一样,你自己的提交记录,GitHub无法识别,签到数据也没了,请问如何让GitHub能够识别你整个仓库中所有的提交记录。
【答案】参考:
5【iOS】有没有办法通过提供的ipa包然后判断出是支持ipad还是iphone,还是都支持。
把IPA解压,包内容的info.plist有个UIDeviceFamily,值=1是iPhone,=2是iPad,=1,2是都支持
/usr/libexec/PlistBuddy -c 'Print :UIDeviceFamily' xxx.app/Info.plist
6【算法】使用熟悉的编程语言,编写一个函数,要求输入与以下列表相似的结构,则返回值为true,否则为false。【注意】输入字符串无限制,英文字符、标点符号均无需特殊处理,与中文一样视为作完整字符

【提示】算法实际为回文算法,题目主要在于边界情况处理,在函数顶端要有判空等操作。可自行搜索,下面提供群里提供的答案,如有瑕疵可以指正。
【答案】
python3 的,天生编码支持好,递归做法:
def check_re(str):
if not str:
return True
if str[0] != str[-1]:
return False
else:
return check_re(str[1:-1])
print(check_re("asdffdsa) //True
print(check_re("asdfdsa)) //True
print(check_re("上海自来水来自海上)) //True
print(check_re(黄山落叶松叶落山黄")) //True
print(check_re("山东落花生花落东山")) //True
print(check_re("山西悬空寺空悬西山") //True
print(check_re("湖南过路车路过南湖")) //True
print(check_re("123456")//False
jS版本:
function judgeIsPalindrome (str) {
if (null == str || str.length < 2) {
return 'false';
} else {
if (str.split(""). reverse().join("")= str) {
return 'true';
} else {
return 'false';
}
}
}
console.log(judgeIsPalindrome('🍎🍌🍇🍇🍌🍎'));
console. log(judgeIsPalindrome('abccba'));
另一 java 版本:
// still 3
public static boolean isPalindrome(String s) {
if (s == null) return false;
int left = 0; int right = s.length()-1;
while (left < right) {
if (s.charAt(left) == ' ') left++;
else if (s.charAt(right) == ' ') right--;
else if (s.charAt(left) != s.charAt(right)) return false;
left++;
right--;
}
return true;
}
7【算法】要求使用熟悉的编程语言,编写一个函数,要求输入任意字符串,都能返回对称结构的字符串。【注意】输入字符串无限制,英文字符、标点符号均无需特殊处理,与中文一样视为作完整字符。

【答案】 详细可以搜:最长回文子串算法。
下面是一种时间复杂度为 O(n^2)的写法,并非最优解,最优解为 Manacher 算法, 时间复杂度O(n), 空间复杂度O(n),可自行搜索。:
public static void main(String[] args) {
// write your code here
String str = "步停马熄灯走马灯灯马走你";
String str1 = "qqqqbcddcbasf";
String str2 = "abcdeff";
String str3 = "11118889999888";
String str4 = "5544334433111";
System.out.println(getStr(str));
System.out.println(getStr(str1));
System.out.println(getStr(str2));
System.out.println(getStr(str3));
System.out.println(getStr(str4));
}
static String getStr(String source) {
if (source == null || source.length() < 1) {
return "\n";
}
for (int i = source.length() / 2; i > 0 ; i--) {
StringBuilder builder = new StringBuilder();
builder.append(String.join("", Collections.nCopies(i, "(.)")));
for (int j = i; j > 0; j--) {
builder.append("\\" + j);
}
String patternStr = builder.toString();
Pattern pattern = Pattern.compile(patternStr);
Matcher m = pattern.matcher(source);
if (m.find()) {
return m.group(0);
}
}
return "\n";
}
8【iOS】看下面的方法执行完之后 ViewController 会被销毁吗,ViewController 的 view 会被销毁吗?为什么?
- (void)addViewController {
UIViewController *viewController = [[UIViewContrnller alloc] init];
[self.view addSubview: viewController.view];
}
【答案】view被引用,vc没被引用,所以VC被销毁,view不销毁。
详细解释:
vc引用view,view对vc无引用。 vc在view在,view在与vc可不在。vc为局部变量,方法结束后直接销毁;vc.view被添加在self.view上,所以不会被销毁.
9【iOS】请给出以下代码的输出结果:
NSArray *array = @[@"1"];
NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithObjects:@"123’, nil];
void(ˆblock)(void) = ˆ{
NSLog(@"array %@",array);
NSLog(@"mutableArray %@",mutableArray);
};
array = @[@"2"];
[mutableArray add0bject:@"456"];
block();

10【问题】【iOS】segment 页面如何进行内存优化。需求描述:segment一次性把所有页面加载出来会导致内存爆增。几个segment 子页面的图片都是高清大图。
题目主要有2个核心:1.多个页面 2.高清大图
针对多个页面,用lazy的形式,用时加载就好了。所以题目主要是讨论高清大图。
如果是作为面试题回答:
苹果方法针对超大图片示例:点击查看
主要是2个方向:1.是压缩高清大图导致的内存暴增。2.是现实高清大图导致的内存暴增。(相关资料自行谷歌,太多太杂。)
http://blog.cnbang.net/tech/2578/
如果是作为项目回答:
-
几乎现在90%的后台服务器都使用的第三方云服务器。资源都是存在对应的云服务器的对象存储器中。
-
几乎所有的对象存储器都支持在线图片处理。(水印,缩放,格式转换等。):
所以正常开发的标准形式为:服务器下发高清的大图地址,客户端根据控件形式预估使用图片的大小。比如用户上传了一张2000像素的图片作为头像,而你当前只是渲染一个可能30像素左右的头像,那你应该直接使用第三方对象存储器的参数渲染一张50左右像素的图片就完全足够使用了。
https://helpcdn.aliyun.com/document_detail/44688.html?spm=a2c4g.11186623.6.1321.516e2e93zb9HsP
以阿里oos对象存储为例的图像缩放文档
-
针对图像的格式进行优化。
使用webp格式,具体的对比:https://aotu.io/notes/2016/06/23/explore-something-of-webp/index.html
也可以使用在线接口返回webp的图片:文档如下:https://helpcdn.aliyun.com/document_detail/44703.html?spm=a2c4g.11186623.6.1336.cd4b35a8Hg5ETw
理论上只要作为这3点,在正常显示高清大图都不会出现什么问题。
作为另外一个补充:
关于高清大图上传问题。
1.理论应该尽可能还原用户创造的原始数据。比如用户上传一个头像,虽然现实控件只有100像素。但是理论上不应该客户端直接把图片压缩了上传给服务器,万一以后这张头像会作为背景图呢?
2.关于流程问题。很多对于资源类型的上传直接使用后台接口上传data。
但是有一个问题是,整个过程是这样的:1.客户端上传data给后台主机。2.主机拿到图片上传到对象服务器。3.对象服务器给主机回调。4.主机给客户端上传结果回调。(举例一个栗子:3个角色,你,财务,人事。(事情是核对你的工资是否正确) 难道不觉得这样的一个流程很傻逼么?流程:财务给你发工资,然后你拿到钱,找人事问应该给你发多少,如果发错了,你再找财务说给你发错了,重新核对。 过程完全可以优化为:财务向人事核对工资是否正确,然后给你发工资
所以,整个过程的标准流程为:向服务器请求token,Bucket,路径等一系列参数。由客户端直接向对象存储器上传,上传成功以后请求接口告知主机上传成功。在这个过程中,主流的对象存储器的sdk都有断点续传等乱七八糟的优化。会一定范围内解决上传内存暴增情况
11【算法】如果无数多的猴子在无数多的打字机上随机的打字,并持续无限的时间,那么在某个时候他们必然会打出莎士比亚的诗集。那么这种说法与哪种不实用得算法类似
【答案】Bogo Sorting 猴子排序。
网友评论