← Static tasks

157. Read N Characters Given Read4

leetcode easy

#array#csharp#easy#leetcode#string

Task

Предположим, что у вас есть файл, и вы можете читать файл только с помощью данного метода read4. Реализуйте метод для чтения n символов.

Метод read4:

API read4 читает четыре последовательных символа из файла, затем записывает эти символы в массив буфера buf4.

Возвращаемое значение — количество фактически прочитанных символов.

Обратите внимание, что у read4 есть собственный указатель файла, аналогично FILE *fp в C.

Определение read4:

Параметр: char[] buf4

Возвращает: int

buf4[] — это назначение, а не источник. Результаты из read4 будут скопированы в buf4[].

Метод read:

Используя метод read4, реализуйте метод read, который читает n символов из файла и сохраняет их в массиве буфера buf. Учтите, что вы не можете напрямую манипулировать файлом.

Возвращаемое значение — количество фактически прочитанных символов.

Определение read:

Параметры: char[] buf, int n

Возвращает: int

buf[] — это назначение, а не источник. Вам нужно будет записать результаты в buf[].

Примечание:

Учтите, что вы не можете напрямую манипулировать файлом. Файл доступен только для чтения с помощью read4, но не для read.

Функция read будет вызываться только один раз для каждого тестового случая.

Вы можете предполагать, что массив буфера назначения, buf, гарантированно имеет достаточно места для хранения n символов.

Пример:

Input: file = "abc", n = 4

Output: 3

Explanation: After calling your read method, buf should contain "abc". We read a total of 3 characters from the file, so return 3.

Note that "abc" is the file's content, not buf. buf is the destination buffer that you will have to write the results to.

C# solution

matched/original
public class Solution : Reader4 {
    public int Read(char[] buf, int n) {
        int copiedChars = 0, readChars = 4;
        char[] buf4 = new char[4];
        while (copiedChars < n && readChars == 4) {
            readChars = Read4(buf4);
            for (int i = 0; i < readChars; i++) {
                if (copiedChars == n)
                    return copiedChars;
                buf[copiedChars] = buf4[i];
                copiedChars++;
            }
        }
        return copiedChars;
    }
}

C++ solution

auto-draft, review before submit
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
public class Solution : Reader4 {
    public int Read(char[] buf, int n) {
        int copiedChars = 0, readChars = 4;
        char[] buf4 = new char[4];
        while (copiedChars < n && readChars == 4) {
            readChars = Read4(buf4);
            for (int i = 0; i < readChars; i++) {
                if (copiedChars == n)
                    return copiedChars;
                buf[copiedChars] = buf4[i];
                copiedChars++;
            }
        }
        return copiedChars;
    }
}

Java solution

matched/original
public class Solution extends Reader4 {
    public int read(char[] buf, int n) {
        int copiedChars = 0, readChars = 4;
        char[] buf4 = new char[4];

        while (copiedChars < n && readChars == 4) {
            readChars = read4(buf4);

            for (int i = 0; i < readChars; ++i) {
                if (copiedChars == n) return copiedChars;
                buf[copiedChars] = buf4[i];
                ++copiedChars;
            }
        }
        return copiedChars;
    }
}

JavaScript solution

matched/original
class Reader4 {
    read4(buf4) {
        return 0;
    }
}

class Solution extends Reader4 {
    read(buf, n) {
        let copiedChars = 0, readChars = 4;
        let buf4 = new Array(4).fill('\0');

        while (copiedChars < n && readChars === 4) {
            readChars = this.read4(buf4);

            for (let i = 0; i < readChars; ++i) {
                if (copiedChars === n) return copiedChars;
                buf[copiedChars] = buf4[i];
                ++copiedChars;
            }
        }
        return copiedChars;
    }
}

Python solution

matched/original
class Solution:
    def read(self, buf: List[str], n: int) -> int:
        copied_chars = 0
        read_chars = 4
        buf4 = [""] * 4

        while copied_chars < n and read_chars == 4:
            read_chars = read4(buf4)

            for i in range(read_chars):
                if copied_chars == n:
                    return copied_chars
                buf[copied_chars] = buf4[i]
                copied_chars += 1

        return copied_chars

Go solution

matched/original
package main

import "fmt"

type Reader4 interface {
    Read4(buf []byte) int
}

type Solution struct {
    Reader4
}

func (sol *Solution) Read(buf []byte, n int) int {
    copiedChars := 0
    readChars := 4
    buf4 := make([]byte, 4)

    for copiedChars < n && readChars == 4 {
        readChars = sol.Read4(buf4)

        for i := 0; i < readChars; i++ {
            if copiedChars == n {
                return copiedChars
            }
            buf[copiedChars] = buf4[i]
            copiedChars++
        }
    }

    return copiedChars
}

func (sol *Solution) Read4(buf []byte) int {
    return 0 
}

func main() {
    sol := &Solution{}
    buffer := make([]byte, 100)
    n := 10 

    bytesRead := sol.Read(buffer, n)
    fmt.Println("Bytes read:", bytesRead)
    fmt.Println("Content read:", string(buffer[:bytesRead]))
}

Explanation

Algorithm

1️⃣

Инициализация и подготовка:

Инициализируйте переменные: copiedChars = 0 для подсчета скопированных символов и readChars = 4 для подсчета прочитанных символов из файла. Начальное значение readChars установлено в 4, что позволяет использовать условие readChars != 4 в качестве маркера конца файла (EOF).

Создайте внутренний буфер из 4 символов: buf4.

2️⃣

Чтение и копирование символов:

Пока количество скопированных символов меньше N (copiedChars < n) и еще есть символы в файле (readChars == 4):

Прочитайте символы из файла во внутренний буфер buf4 с помощью метода read4(buf4).

Копируйте символы из внутреннего буфера buf4 в основной буфер buf по одному. Увеличивайте copiedChars после каждого скопированного символа.

3️⃣

Завершение процесса:

Если количество скопированных символов достигло N (copiedChars == n), прервите процесс копирования.

Верните copiedChars как результат функции, указывающий на количество успешно скопированных символов в основной буфер buf.

😎