157. Read N Characters Given Read4

LeetCode easy оригинал: C# #array #csharp #easy #leetcode #string

Предположим, что у вас есть файл, и вы можете читать файл только с помощью данного метода 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# решение

сопоставлено/оригинал
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++ решение

auto-draft, проверить перед отправкой
#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 решение

сопоставлено/оригинал
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 решение

сопоставлено/оригинал
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 решение

сопоставлено/оригинал
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 решение

сопоставлено/оригинал
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]))
}

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.

😎

Вакансии для этой задачи

Показаны активные вакансии с пересечением по тегам задачи.

Все вакансии
Активных вакансий пока нет.