美文网首页
技术清谈汇总(二)

技术清谈汇总(二)

作者: 坤哥爱卿 | 来源:发表于2020-03-18 17:25 被阅读0次

转载于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都不能被拉伸或者压缩:

image

【答案】需要给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。【注意】输入字符串无限制,英文字符、标点符号均无需特殊处理,与中文一样视为作完整字符

image.png

【提示】算法实际为回文算法,题目主要在于边界情况处理,在函数顶端要有判空等操作。可自行搜索,下面提供群里提供的答案,如有瑕疵可以指正。

【答案】

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【算法】要求使用熟悉的编程语言,编写一个函数,要求输入任意字符串,都能返回对称结构的字符串。【注意】输入字符串无限制,英文字符、标点符号均无需特殊处理,与中文一样视为作完整字符。

image.png

【答案】 详细可以搜:最长回文子串算法。

下面是一种时间复杂度为 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(); 

参考: 《iOS中__block 关键字的底层实现原理》

10【问题】【iOS】segment 页面如何进行内存优化。需求描述:segment一次性把所有页面加载出来会导致内存爆增。几个segment 子页面的图片都是高清大图。

题目主要有2个核心:1.多个页面 2.高清大图
针对多个页面,用lazy的形式,用时加载就好了。所以题目主要是讨论高清大图。

如果是作为面试题回答:

苹果方法针对超大图片示例:点击查看
主要是2个方向:1.是压缩高清大图导致的内存暴增。2.是现实高清大图导致的内存暴增。(相关资料自行谷歌,太多太杂。)
http://blog.cnbang.net/tech/2578/

如果是作为项目回答:

  1. 几乎现在90%的后台服务器都使用的第三方云服务器。资源都是存在对应的云服务器的对象存储器中。

  2. 几乎所有的对象存储器都支持在线图片处理。(水印,缩放,格式转换等。):

    所以正常开发的标准形式为:服务器下发高清的大图地址,客户端根据控件形式预估使用图片的大小。比如用户上传了一张2000像素的图片作为头像,而你当前只是渲染一个可能30像素左右的头像,那你应该直接使用第三方对象存储器的参数渲染一张50左右像素的图片就完全足够使用了。

    https://helpcdn.aliyun.com/document_detail/44688.html?spm=a2c4g.11186623.6.1321.516e2e93zb9HsP

    以阿里oos对象存储为例的图像缩放文档

  3. 针对图像的格式进行优化。

    使用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 猴子排序。

相关文章

  • 技术清谈汇总(二)

    转载于Github技术清谈 1【问题】【算法】缓存操作进行优化的措施中,有没有迎合用户“喜旧厌新”的算法技巧,可谓...

  • 技术清谈汇总(一)

    转载于Github技术清谈 1.【问题】【iOS】请问前后台切换,会发生些什么,系统哪些方法会被调用,viewco...

  • CEO全球站运营周报(2020.3.16-2020.3.22)

    CEO全球站(2020.3.16-2020.3.22)运营及研发周报汇总如下: 技术研发 1、CoinBank二期...

  • 常识:跬步集28

    积累丰富的常识,可以拓宽认知的视阈值,提升个人的基本判断力。比如①“清谈误国,实干兴邦”,“清谈”就是聊天?②“二...

  • 电子技术经典资料汇总:PCB设计篇

    电子技术经典资料汇总:PCB设计篇 分享《电子技术经典资料汇总:PCB设计篇》的资料,还有电子技术基础入门资料在闯...

  • 豪门才女谢道韫之六--清谈解围

    魏晋士人最重清谈,有清谈才能者最受重视。清谈场上最能体现他们的才情和学识。其时,清谈内容以《庄》 《老》 《易》三...

  • 魏晋玄学的精神与特色

    (1)清谈与思辨 清谈是玄学的表现形式。魏晋时期,玄学家们之间盛行清谈之风。清谈亦谓之“清言”,不谈国事、民生...

  • 清谈

    草木生于崖或海? 旅人讴歌风或谁的胸怀? 烹茶说宇宙万物原, 剪花剪出附庸风雅, 春蛙秋蝉偏偏是今夏盛开。 轰隆隆...

  • 清谈

    暑假的大部分时间,我都居住于湖南南部的一座小城。在熙熙攘攘的人群中,过着近乎隐居的生活,以一种十分俗世但又十分惬...

  • 清谈

    前几天,同事玩笑话说:事多的五月即将过去,多事的六月又要来了。 好像还真是这么一回事,自己除了教学工作还有行政工作...

网友评论

      本文标题:技术清谈汇总(二)

      本文链接:https://www.haomeiwen.com/subject/vwhcyhtx.html