记录scriptoj 简单算法 笔记

#44 同字母异序
同字母异序指的是两个字符串字母种类和字母的数量相同,但是顺序可能不同。
完成 isAnagram,接受两个字符串作为参数,返回true 或者 false 表示这两个字符串是否同字母异序。例如:
isAnagram("anagram", "nagaram") // => return true.
isAnagram("rat", "car") // => return false.

我的解法
const isAnagram = (str1, str2) => /* TODO */
//1.先判断两个单词的个数是否相同
//2.for循环匹配单词是否一致
{
  if(str1.length==str2.length){
    var len=str1.length;
    for(var i=0;i<len;i++){
      if(str2.indexOf(str1[i])<0){
        return false;
      }
    }
    return true;
  }else{
    return false;
  }
}
大神解法
//参考答案,先拆分排序再合并,最后比较
const isAnagram = (str1, str2) => str1.split('').sort().join('') === str2.split('').sort().join('');

#53 你会被谷歌拒绝吗?
使用广度优先的原则用数组的表示就是 [4, 3, 2, 7, 1, 2, 3, 6, 5, 9, null, null, null, null, null],二叉树中的空位用 null 表示。
进行反转以后会变成[4, 2, 3, 3, 2, 1, 7, null, null, null, null, null, 9, 5, 6]

我的思路
1.将数组按照2的n次方切割成多个数组
2.将着多个数据反序
4.再合并多个数组
ps.有思路但是一直写得报错,下面是和我思路一样的小伙伴写得
const invertTree = (tree) => {
  let i = 1;
  if(tree.length<1)
    return [];
    let newTree = [tree[0]];
    while(Math.pow(2,i)<=tree.length+1){
      newTree.push(...tree.slice(Math.pow(2, i)-1,Math.pow(2, i+1)-1).reverse());
//写成 newTree.push(...tree.slice(xxx, yyy)) 和写成 newTree = newTree.concat(tree.slice(xxx, yyy)) 作用是一样的

      i++;
    }
  return newTree;
}
某神解法
const invertTree = (tree) => {
  /* TODO
这里面用了很多我好像没见过的写法,很方,我要去求解,后续整理放上
 */
  let ret = []
  for(let cur=1; tree.length > cur; cur<<=1) {
  let mask = cur - 1
  for(let x=0; x < cur; ++x)
  ret.push(tree[mask+(mask^x)])
  }
  return ret
}

大神详解

大神说翻转二叉树,向来都不会是像我那样这么写的= =!
可以用递归,BFS 或者 DFS 写。这两个思路,效率都会很低。因为涉及到 push。第一种还用了 reverse。
一般来说,二叉树的题会给你 TreeNode (节点)的构造器。哪怕不给你,自己也要会写:
function TreeNode(value) {
    this.value = value;
    this.left = this.right = null;
}
一个节点只需要三个属性就够:value 表示当前节点值,left 表示左边的节点,right 表示右边

用递归写就很容易了:
function invertTree(root) {
    if (root === null) {
        return root;
    }
    
    var _temp = root.left;
    root.left = invertTree(root.right);
    root.right = invertTree(_temp);

    return root;
}
//ps大神这个方法适合面试的时候回答,但是针对scriptoj 这题来说不能直接用

官方解法

//可以看出代码和大神说的有异曲同工之妙
const parseTree = (tree) => {
 if(tree.length <= 3) {
   const [root, left, right] = tree
   return [root, [right], [left]]
 }
 const left = []
 const right = []
 let floor
 tree.slice(1).forEach((value, index) => {
   floor = ~~(Math.log(index + 2) / Math.LN2)
   if (left.length < Math.pow(2, floor) - 1) {
     left.push(value)
   } else {
     right.push(value)
   }
 })
 return [tree[0], parseTree(right), parseTree(left)]
}

const flatTree = (tree) => {
 if (tree.every(node => !Array.isArray(node))) return tree
 const roots = tree.filter(node => !Array.isArray(node))
 const children = tree.filter(node => Array.isArray(node)).reduce(
   (children, child) => children.concat(child), [])
 return roots.concat(flatTree(children))
}

const invertTree = (tree) => {
 const parsedInvertedTree = parseTree(tree)
 return flatTree(parsedInvertedTree)
}

大神针对此题的解法

/*
需要翻转的子数组,index 范围存在这样的关系:
1, 2^1;
1 + 2^1, 2^1 + 2^2;
1 + 2^1 + 2^2, 2^1 + 2^2 + 2^3;

swapInRange 用了双指针 + 递归。其实不用也行。
这里面,空间复杂度是 1,因为只用到了常数。时间复杂度貌似没啥优化=。=
*/
const invertTree = (tree) => {
  var _index=1;
  var i=1;
  var j=Math.pow(2,i);
  while(j<tree.length){
    swapInRange(i,j);
    i=j+1;
    _index++;
    j+=Math.pow(2,_index)
  }
  return tree;
  
  function swapInRange(start,end){
    if(start < end){
      var temp=tree[start];
      tree[start]=tree[end];
      tree[end]=temp;
      swapInRange(start+1,end-1)
    }
  }
}

这道题,二叉树的表示方法并不标准,这是用层先遍历的方式,遍历二叉树生成的数组
因此有一部分小伙伴会和我一样,直接把这题当数组题处理,把数组进行切片反转拼接
但此题主题是二叉树,那我们得先了解二叉树
二叉树,数据结构很简单。就是节点的值,左节点,右节点。
参考https://www.cnblogs.com/tugenhua0707/p/4361051.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,550评论 18 139
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,715评论 0 33
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,524评论 18 399
  • 可以在给url动态加上一个生成随机数的参数。这样每次打开路径都不一样,就不会去加载缓存。哈哈哈机智如我。
    nofantasy阅读 2,211评论 0 0
  • 炎热的度假时光马上就要开始了,一想到可以到海边或者游泳池就觉得很兴奋。不过,想要出门的话当然也要专门准备必备单品。...
    D3舍阅读 584评论 0 1