LeetCode ソリューション (JavaScript を使用) [3]

(1) ターゲット配列を所定の順序で作成する

2 つの整数配列 nums と index が与えられます。次のルールに従って、ターゲット配列を作成する必要があります。

ターゲット配列ターゲットは、最初は空です。
nums[i] と index[i] を左から右に順番に読み取り、値 nums[i] をターゲット配列の添字 index[i] に挿入します。
nums または index で読み取る要素がなくなるまで、前の手順を繰り返します。
対象の配列を返してください。

タイトルは、番号の挿入位置が常に存在することを保証します。

/**
 * @param {number[]} nums
 * @param {number[]} index
 * @return {number[]}
 */
var createTargetArray = function(nums, index) {
    
    
var a = [];
for(var i = 0;i<nums.length;i++){
    
    //对数组进行循环遍历
    a.splice(index[i],0,nums[i]);
	//向a数组中的index[]位置添加nums[i]这个数,删除0个数。
	}
return a;
};

注:
splice() メソッドは、配列に項目を追加/配列から削除し、削除された項目を返します。

注: このメソッドは元の配列を変更します。したがって、 a が取得する戻り値は挿入された配列です。これは、要求した新しい配列です。
構文
arrayObject.splice(index,howmany,item1,...,itemX)

パラメータ 説明
索引 必要 項目を追加/削除する場所を指定する整数。負の数を使用して、配列の末尾からの位置を指定します。
幾つか 必要 削除するアイテムの数。0 に設定すると、アイテムは削除されません。
アイテム1、…、アイテムX オプション 配列に追加された新しいアイテム。

(2) 連結リストのノードを削除する

リンクされたリスト内の特定の (終了していない) ノードを削除できる関数を作成してください。削除する必要があるノードのみが与えられます。

既存の連結リスト – head = [4,5,1,9] があり、次のように表現できます:
4->5->1->9
例 1:

入力: ヘッド = [4,5,1,9]、ノード = 5
出力: [4,1,9]
説明: リンク リストの 2 番目のノードの値が 5 の場合、関数を呼び出した後、リンク リストは次のようになります。 4 -> 1 -> 9.
例 2:

入力: ヘッド = [4,5,1,9]、ノード = 1
出力: [4,5,9]
説明: リンク リストの 3 番目のノードの値が 1 の場合、関数を呼び出した後、リンク リストは次のようになります。 4 -> 5 -> 9 になります。

説明します:

リンク リストには、少なくとも 2 つのノードが含まれます。
リンクされたリスト内のすべてのノードの値は一意です。
指定されたノードは終了ノードではなく、リンク リスト内の有効なノードである必要があります。
関数から結果を返さないでください。

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} node
 * @return {void} Do not return anything, modify node in-place instead.
 */
var deleteNode = function(node) {
    
    
    node.val=node.next.val;
    node.next=node.next.next;
};

注:
連絡先リストのノードを削除するには、実際には次のノードが削除されます。

例えば[4,5,1,9]を削除する場合、5ならまずnode.val=node.next.valとし、[4,1,1,9]となり、ノードに進む .next=node.next.next の操作は 2 番目の 1 を削除することに相当し、最終的な結果は [4,1,9] になります。

(3) すべてのポイントを訪問するための最短時間

平面上には n 個の点があり、点の位置は整数座標 points[i] = [xi, yi] で表されます。これらすべてのポイントを訪れるのに必要な最小時間 (秒) を計算してください。

次のルールに従って飛行機に乗ることができます。

1 秒ごとに水平または垂直に 1 単位長移動するか、対角線を横切る (1 秒間に水平または垂直に 1 単位長移動すると見なすことができる)。
ポイントは、配列に表示される順序でアクセスする必要があります。

例 1:
ここに画像の説明を挿入入力: points = [[1,1],[3,4],[-1,0]]
出力: 7
説明: 最適なアクセス パスは [1,1] -> [2, 2] です。 -> [3,3] -> [3,4] -> [2,3] -> [1,2] -> [0,1] -> [-1,0] [1,1]
から [1,1] へ[3,4] は
[3,4] から [-1,0] まで3 秒かかり、
合計 7 秒で4 秒かかります

例 2:

入力: ポイント = [[3,2],[-2,2]]
出力: 5

ソース: LeetCode
リンク: https://leetcode-cn.com/problems/minimum-time-visiting-all-points
著作権は LeetCode に帰属します。商用転載の場合は公式の許可に連絡してください。非商用転載の場合は出典を示してください。

/**
 * @param {number[][]} points
 * @return {number}
 */
var minTimeToVisitAllPoints = function(points) {
    
    

var a = 0;
for(var i = 0;i<points.length-1;i++)
{
    
    
  var x =  Math.abs(points[i][0]-points[i+1][0]);
  var y =  Math.abs(points[i][1]-points[i+1][1]);
  if(x==y)
  {
    
    a = a+x;}
  else if(x>y)
  {
    
    a = a+x;}
  else 
  {
    
    a = a+y;
  }
}
return a;
};

解決策:
ここに画像の説明を挿入
これはチェビシェフ距離であるため、すべての隣接点をトラバースし、チェビシェフ距離の合計を計算するだけで済みます。
戻り値が値であることを確認するには、それを定義する必要があります。次に、ループ内で x 軸と y 軸の絶対値を比較し、大きい方を戻り値に追加し、最後にトラバースして最終結果を取得します。

(4) 二項連結リストを整数に変換する

単方向リストの参照ノード ヘッドを指定します。リンク リスト内の各ノードの値は、0 または 1 です。この連結リストは、整数のバイナリ表現であることが知られています。

リンクされたリストで表される数値の 10 進数値を返してください。
例 1:
1->0->1
入力: head = [1,0,1]
出力: 5
説明: 2 進数 (101) を 10 進数 (5) に変換します。
例 2:

入力: head = [0]
出力: 0
例 3:

入力: head = [1]
出力: 1
例 4:

入力: head = [1,0,0,1,0,0,1,1,1,0,0,0,0,0,0]
出力: 18880
例 5:

入力: head = [0,0]
出力: 0

ヒント:

リンクされたリストは空ではありません。
リンク リスト内のノードの総数は 30 を超えません。
各ノードの値は 0 または 1 です。

ソース: LeetCode
リンク: https://leetcode-cn.com/problems/convert-binary-number-in-a-linked-list-to-integer
著作権は Leetcode Network に帰属します。商用転載の場合は公式の許可に連絡してください。非商用転載の場合は出典を示してください。

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {number}
 */
var getDecimalValue = function(head) {
    
    
    //将链表转换成字符串
    number = '';
    while(head)
    {
    
    
        number += head.val;
        head = head.next;
    }
    return parseInt(number,2);
};

解決策:
最初にリンク リストを文字列に変換し、次に parseInt 関数を使用して文字列を解析して整数にします。
w3school の parseInt 関数の説明は
使用して
基本モードを使用しています (作成者はこの関数についてまだ少し理解しています)
以下はECMAScript の型変換を拡張したものです
ここに画像の説明を挿入

(5)コインを取る

テーブルには n 個の利光コインの山があり、各山の数は配列コインに格納されています。毎回任意の山を選択し、そのうちの 1 つまたは 2 つを取り、すべてのコインを取得するための最小回数を見つけることができます。

例 1:

入力: [4,2,1]

出力: 4

解説:立光コインは1山目2回以上、2山目1回以上、3山目1回以上、合計4回とることができます。 .

例 2:

入力: [2,3,10]

出力: 8

制限:

1 <= n <= 4
1 <= コイン[i] <= 10

ソース: LeetCode
リンク: https://leetcode-cn.com/problems/na-ying-bi
著作権は LeetCode Network に帰属します。商用転載の場合は公式の許可に連絡してください。非商用転載の場合は出典を示してください。

/**
 * @param {number[]} coins
 * @return {number}
 */
var minCount = function(coins) {
    
    
    var n = 0;
    for(i=0;i<coins.length;i++){
    
    
        if(coins[i]%2==0)
        {
    
    
            n +=coins[i]/2; 
        }
        else
        {
    
    
            n +=Math.floor(coins[i]/2)+1; 
        }
    }
    return n;
};

解決策
今回は、Math.floor を再度使用します。配列内の数値を順番にトラバースする必要があり、配列内の各値の操作回数の合計である数値が返されます。配列内の数値を操作するときは、議論する必要があります奇数と偶数. js では、a が奇数の場合、a/2 は隣接する整数を取得するとは限らないため、Math.floor 関数を使用して値を取得する必要があります。(この質問の冒頭で私が間違っていたのは、Math.floor 関数を使用せず、除算演算を直接実行したためです) i
ここに画像の説明を挿入


追記: 数日でたくさんの質問をして、徐々にこの感じが好きになりましたが、まだある程度の知識には盲点があります. 他の人の解決策を見ても、まだ非常に難しいと感じています.し、それはまだ知識の蓄えの問題です。

おすすめ

転載: blog.csdn.net/weixin_34727238/article/details/106073561