【leetcode 622】設計ループキューJava問題解

2373 ワード

leetcode分類の下ですべての問題解は作者本人が比較した後に選んだ問題解であり、読みやすく、メンテナンス性に優れている.
問題ごとに1つの答えしかなく、煩雑で実用的でない案を避けるため、必ずしも最適解とは限らない.
ループキュー実装を設計します.ループキューは、FIFO(先進的なプリフェッチ)の原則に基づいて動作し、キューの最後がキューの先頭に接続されてループを形成する線形データ構造である.「リングバッファ」とも呼ばれています.
ループキューの利点の1つは、このキューが以前に使用した空間を利用できることです.通常のキューでは、キューがいっぱいになると、キューの前にスペースがあっても次の要素を挿入できません.しかし、ループキューを使用すると、これらのスペースを使用して新しい値を格納することができます.
あなたの実装は、次の操作をサポートする必要があります.
  • MyCircularQueue(k):コンストラクタ、キュー長kを設定します.
  • Front:キューヘッダから要素を取得します.キューが空の場合は、-1を返します.
  • Rear:キューの末尾要素を取得します.キューが空の場合は、-1を返します.
  • enQueue(value):ループキューに要素を挿入します.挿入に成功した場合は真を返します.
  • deQueue():ループキューから要素を削除します.削除に成功した場合は、真を返します.
  • isEmpty():ループキューが空であるかどうかを確認します.
  • isFull():ループキューがいっぱいかどうかを確認します.

  •  
    例:
    MyCircularQueue circularQueue = new MycircularQueue(3); //       3
    
    circularQueue.enQueue(1);  //    true
    
    circularQueue.enQueue(2);  //    true
    
    circularQueue.enQueue(3);  //    true
    
    circularQueue.enQueue(4);  //    false,    
    
    circularQueue.Rear();  //    3
    
    circularQueue.isFull();  //    true
    
    circularQueue.deQueue();  //    true
    
    circularQueue.enQueue(4);  //    true
    
    circularQueue.Rear();  //    4
     

     
    ヒント:
  • すべての値は0です. 1000までの範囲内
  • のオペランドは1〜1000の範囲内である.
  • 内蔵キューライブラリは使用しないでください.
  • class MyCircularQueue {
    
        int[] queue;
        int count, front, rear;
    
        public MyCircularQueue(int k) {
    
            queue = new int[k];
        }
    
        public boolean enQueue(int value) {
    
            if (isFull())
                return false;
            queue[rear] = value;
            rear = (rear + 1) % queue.length;
            count++;
            return true;
        }
    
        public boolean deQueue() {
    
            if (isEmpty())
                return false;
            front = (front + 1) % queue.length;
            count--;
            return true;
        }
    
        public int Front() {
    
            if (isEmpty())
                return -1;
            return queue[front];
        }
    
        public int Rear() {
    
            if (isEmpty())
                return -1;
            return rear == 0 ? queue[queue.length - 1] : queue[rear - 1];
        }
    
    
        public boolean isEmpty() {
    
            return count == 0;
        }
    
        public boolean isFull() {
    
            return count == queue.length;
        }
    }

    考え方:
  • 自理