题1:对一个有序数组去除重复元素,返回无重复的数组的长度

解决思路:

有序数组,不是递增就是递减。有序的,有利于使用双指针去重。

用双指针算法,一个指针pre指向第一个元素,另一个指针i遍历第二个元素到最后一个元素。如果pre指向的元素不等于i指向的元素,用pre+1的位置保存i指向的元素;

如果pre指向的元素等于i指向的元素,pre还在原位置。

当数组遍历完成的时候,[0,pre]这区间存的就是这个有序数组去重之后的结果。

class Solution {

/**

* @param Integer[] $nums

* @return integer

*/

function remDupli($nums) {

//pre指向有序数组的索引0的位置

$pre = 0;

$len = count($nums);

if($len == 0){

return 0;

}

for($i=1;$i

if($nums[$pre] != $nums[$i]){

$pre ++;

$nums[$pre] = $nums[$i];

}

}

//去重的区间段[0,$pre],所以长度是pre+1

return $pre+1;

}

}

$nums = [0,1,2,3,4,5,5,6];

$nums =[2,2,2,3,4,4,5,5];

$obj = new Solution();

$res = $obj->remDupli($nums);

var_dump($res);

//4

题2:一个字符串有小写字母和数字组成,对这个字符串进行重新格式化,使得字符串相邻的类型不同。如果不能格式化相邻不同的字符串,返回空字符串。

解决思路:

根据题意,计算字符串中数字的个数,看数字和字母是否相等。可以知道是否能格式化。数字和字母的个数差不能大于1。

然后把数字和字母,一个个的连起来。对撞指针的方式把字母和数字分布到字符串的两端。对撞指针的好处是不需要额外的空间。

class Solution {

/**

* @param string $str

* @return string

*/

function format($str) {

$len = strlen($str);

$l = 0;

$r = $len -1;

$res_str = '';

//第一步:左边放字母,右边放数字

while($l

//使用双指针,遇到需要交换的,进行交换。

//var_dump($l-$r,$l,$r,$str);

//左边是字母,继续。遇到不是字母就停下,准备交换

if($this->is_alpha($str{$l})){

$l++;

}

//左边是数字,继续。遇到不是数字就停下,准备交换

if($this->is_int($str{$r})){

$r--;

}

//当左边是数字,右边是字母时,下面进行交换。

if($this->is_int($str{$l}) && $this->is_alpha($str{$r})){

//var_dump('--',$str);

$tmp = $str{$l};

$str{$l} = $str{$r};

$str{$r} = $tmp;

$l++;

$r--;

}

}

//var_dump('----',$l,$r,$str);

//第二步:找到字母和数字的分界点

$l = 0;

$r = 0;

for($i=0;$i

if($this->is_int($str{$i})){

$l = $i-1;

$r = $i;

break;

}

}

//[0,$l]是字母,[$r,$len-1]是数字。

//字母和数字的个数差不能大于1,根据题意返回空字符串。

if(abs(($len - ($l+1))-($l+1)) > 1){

return '';

}

//第三步:组成格式化的字符串

//$len - ($l+1) 是右边,即数字的个数 , $l+1 是字母的个数

if($len - ($l+1) > $l+1){

//数字多的情况,先取数字。数字取完循环结束。

for($i=0,$j=$len-1;$j>=$r;$i++,$j--){

$res_str .= $str{$j};

//在字母范围内,取出字母,超出范围,就不取字母了。

if($i <= $l){

$res_str .= $str{$i};

}

}

}else{

//字母多的情况,先取字母。字母取完循环结束。

for($i=0,$j=$len-1;$i<=$l;$i++,$j--){

$res_str .= $str{$i};

//在数字范围内,取出数字,超出范围,就不取数字了。

if($j >= $r){

$res_str .= $str{$j};

}

}

}

return $res_str;

}

function is_alpha($a){

if($a >= 'a' && $a <= 'z'){

return 1;

}else{

return 0;

}

}

function is_int($a){

if($a >= '0' && $a <= '9'){

return 1;

}else{

return 0;

}

}

}

$str = '9o5ck83';

$obj = new Solution();

$res = $obj->format($str);

var_dump($res);

//3k8o9c5

双指针用法和优势

对于有序的,相邻的数字一样的留下一个就在全局去重了,使用双指针,可以提高效率;还有就是双指针可以快速的交换元素,整理数据,进行快速分类。

优势:不需要额外的空间,执行效率高。

字节跳动面试经验 php,双指针算法:字节跳动初级面试题 PHP相关推荐

  1. 已拿 Offer!字节跳动面试经验分享

    去年,学校有位学长参加秋招的时候,拿到了字节跳动.快手.阿里.美团--等等 7 家大厂的 Offer,在此之前,学长一直"默默无闻",基本可以说是在秋招一战成名,成为众多学弟学妹羡 ...

  2. 人生中第一次面试-----字节跳动面试经验总结

    20190801 我经历了人生中的第一次面试,一面感觉还行,二面有点惨.(一面和二面是连在一起的),三面也很惨,四面也好惨.然后坚持到hr面. 未来的事情好多不确定,但是唯一要做的还是要不断充实自己, ...

  3. 2020软件开发工程程序员面试经验分享--菊厂OD现场码代码试题1

    1.设计电梯时,房地产商要求在电梯按钮上不允许出现数字"4",即电梯数字序列为1,2,3,5,6,7,8,9,10--,现在需要提供一个函数getRealLevel,传入电梯按钮上 ...

  4. 字节跳动面试锦集(二):项目HR高频面试总结

    1.项目开发中遇到的最大的一个难题和挑战,你是如何解决的.(95% 会问到) 说说你开发最大的优势点(95% 会问到) 你为什么会离开上家公司 你的缺点是什么? 你能给公司带来什么效益? 你对未来的职 ...

  5. 平安租赁面试java_2019平安租赁面试经验(资产运作,企业融资部等)

    为了帮助职业圈网友能够及时了解平安租赁的面试流程以及面试过程所涉及的面试问题,职业圈小编把2019最新平安租赁面试经验编辑好,马上提供给大家,以便能够尽快帮助到有需要的人.文章中还为你提供平安租赁面试 ...

  6. 字节跳动2022年最新面试经验分享,2个部门6轮面试全复盘(算法岗)

    说起1.2月,绝对算得上求职者的黄金准备期.传说中的金三银四和校园春招都马上要到来了,相信有准备的朋友们已经开始刷题了,今天就为大家分享一篇字节跳动的真实面经: 字节电商&垂直策略部nlp算法 ...

  7. 金九银十!字节跳动三轮面试惨败,总结面试经验,下次再战!

    写在开篇 和往年相比,今年的秋招看上去不是那么顺利,多少都受疫情有所影响,但是令我惊讶的是第一家给我面试机会的公司竟然是宇宙条.一开始接到面试通知时,心情特别复杂,紧张又兴奋,字节跳动是出了名的考算法 ...

  8. 字节跳动面试算法题目以及答案

    题目来源于牛客 https://www.nowcoder.com/discuss/455003?type=post&order=time&pos=&page=2&cha ...

  9. 软件测试字节跳动头条项目面试,字节跳动|今日头条面试经验分享

    最近一直在找实习,历时1个月,投了无数被拒了无数终于拿到想要的offer了!最近在面腾讯,分享一下字节跳动今日头条的面试经验攒人品啦- P1-5:面试官问的问题 P6:总体感受 (面试问题我放在最后了 ...

最新文章

  1. 语义网所谓的“本体”的具体例子是什么?人工智能
  2. js控制图片的缩放代码示例
  3. python怎么打开交互式窗口-使用pycharm进行交互式shell调试
  4. luogu P1393 P3157 动态逆序对
  5. Blockchain:《Blockchain applications in insurance》Deloitte—德勤区块链技术研究报告正文版—听课记录
  6. 3D数学基础:图形与游戏开发---随笔一
  7. java jvm 内存参数_深入详解JVM内存模型与JVM参数详细配置
  8. oracle数据库教程-张晨光-专题视频课程
  9. ubuntu要更新18.04了,lei了lei了~~~
  10. ORM框架SQLAlchemy使用学习
  11. angularjs post返回html_Python 爬虫网页解析工具lxml.html(二)
  12. 数据切分——Mysql分区表的建立及性能分析
  13. MR_LINUX_DRIVER安装教程,ovito安装说明(windows+linux)
  14. InstallShield12豪华版破解版下载|InstallShield下载|软件打包工具
  15. 互联网产品经理面试问题汇总(18问)
  16. IntelliJ IDEA使用记录:maven projects-compile提示【**类,找不到符号】
  17. 初次项目:电子通讯录
  18. python的web框架flask_PythonWEB框架之Flask
  19. UVA1586 Molar Mass(分子量)
  20. nginx的安装和配置

热门文章

  1. 【细节处理】LeetCode 66. Plus One
  2. Leetcode 261.以图判树
  3. kA*与(kA)*的行列式计算
  4. 文献阅读:《Generative Adversarial Active Learning for Unsupervised Outlier Detection》-2020 trans
  5. vbScript: 编号成生不夠位數前面加零
  6. JQ 1.9 API在线资源
  7. ubuntu下vim与系统剪切板互相拷贝
  8. Vc6.0打开该文件坠毁
  9. [zz]ASP.net中新建Web网站与新建Web应用程序的区别
  10. IOT物联网观察之物联网建设为什么是供给侧改革的重要途径?