js初心者が必要に迫られて書くことになったのでleetcodeで日々是筋トレ。
JavaScriptの配列の挙動に戸惑ったのでメモを残します。
配列挙動に戸惑ったわけではなく、コメントでご指摘いただいた通り、単純にvar
のつけ忘れでした。。
今回詰まった問題はこちら
https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/
ソート済みの配列を二分探索木にしてというもの。
下記のようなサンプルを作ってみた。
最初に作ったもの.js
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {number[]} nums
* @return {TreeNode}
*/
var sortedArrayToBST = function(nums) {
if (nums.length == 0) {
return null
}
if (nums.length == 1) {
return new TreeNode(nums[0])
}
midIdx = Math.floor(nums.length / 2)
mid = nums[midIdx]
console.log(nums.slice(midIdx+1)) // デバッグで追加
var ans = new TreeNode(mid)
ans.left = sortedArrayToBST(nums.slice(0, midIdx))
console.log("-----") // デバッグで追加
console.log(nums.slice(midIdx+1)) // デバッグで追加
ans.right = sortedArrayToBST(nums.slice(midIdx+1))
return ans;
};
入力: [-10,-3,0,5,9]
コンソール:
[ 5, 9 ]
[]
-----
[]
-----
[ 0, 5, 9 ]
[ 9 ]
-----
[ 9 ]
ファッッッ! nums.slice(midIdx+1)
の値が再帰関数を呼び出すと値が変わってしまっている。。。
仕方なしに下記のように再帰関数を呼び出す前に違う変数 nums2
に格納して対応。
correct.js
var sortedArrayToBST = function(nums) {
if (nums.length == 0) {
return null
}
if (nums.length == 1) {
return new TreeNode(nums[0])
}
midIdx = Math.floor(nums.length / 2)
mid = nums[midIdx]
var nums2 = nums.slice(midIdx+1)
var ans = new TreeNode(mid)
ans.left = sortedArrayToBST(nums.slice(0, midIdx))
ans.right = sortedArrayToBST(nums2)
return ans;
};
無事動いてくれましたが、原因不明です。
参照渡しになって勝手に変数が書き変わってしまうのでしょうか...
もっとjs詳しくならねばと思う今日この頃でした。。