937. Reorder Data in Log Files

LeetCode medium original: C# #array #csharp #graph #leetcode #medium #sort #string
Der Aufgabentext wird für die gewählte Sprache aus dem Russischen übersetzt. Code bleibt unverändert.

Вам дается Array журналов. Каждый журнал представляет собой строку слов, ограниченную пробелами, где первое слово является идентификатором. Существует два типа журналов: Буквенные журналы: Все слова (кроме идентификатора) состоят из строчных английских букв. Цифровые журналы: Все слова (кроме идентификатора) состоят из цифр. Упорядочите эти журналы таким образом: буквенные журналы идут перед всеми цифровыми журналами. Буквенные журналы сортируются лексикоGraphически по их содержанию. Если их содержимое одинаково, то отсортируйте их лексикоGraphически по их идентификаторам. Цифровые журналы сохраняют свой относительный порядок. return окончательный порядок журналов.

Beispiel:

Input: logs = ["dig1 8 1 5 1","let1 art can","dig2 3 6","let2 own kit dig","let3 art zero"]

Output: ["let1 art can","let3 art zero","let2 own kit dig","dig1 8 1 5 1","dig2 3 6"]

C# Lösung

zugeordnet/original
using System;
using System.Linq;
public class Solution {
    public string[] ReorderLogFiles(string[] logs) {
        return logs.OrderBy(log => log, Comparer<string>.Create((log1, log2) => {
            var split1 = log1.Split(new char[] { ' ' }, 2);
            var split2 = log2.Split(new char[] { ' ' }, 2);
            bool isDigit1 = char.IsDigit(split1[1][0]);
            bool isDigit2 = char.IsDigit(split2[1][0]);
            
            if (!isDigit1 && !isDigit2) {
                int cmp = string.Compare(split1[1], split2[1]);
                if (cmp != 0) return cmp;
                return string.Compare(split1[0], split2[0]);
            }
            return isDigit1 ? 1 : -1;
        })).ToArray();
    }
}

C++ Lösung

Auto-Entwurf, vor dem Einreichen prüfen
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
    public vector<string> ReorderLogFiles(vector<string> logs) {
        return logs.OrderBy(log => log, Comparer<string>.Create((log1, log2) => {
            var split1 = log1.Split(new char[] { ' ' }, 2);
            var split2 = log2.Split(new char[] { ' ' }, 2);
            bool isDigit1 = char.IsDigit(split1[1][0]);
            bool isDigit2 = char.IsDigit(split2[1][0]);
            
            if (!isDigit1 && !isDigit2) {
                int cmp = string.Compare(split1[1], split2[1]);
                if (cmp != 0) return cmp;
                return string.Compare(split1[0], split2[0]);
            }
            return isDigit1 ? 1 : -1;
        })).ToArray();
    }
}

Java Lösung

zugeordnet/original
import java.util.Arrays;

class Solution {
    public String[] reorderLogFiles(String[] logs) {
        Arrays.sort(logs, (log1, log2) -> {
            String[] split1 = log1.split(" ", 2);
            String[] split2 = log2.split(" ", 2);
            boolean isDigit1 = Character.isDigit(split1[1].charAt(0));
            boolean isDigit2 = Character.isDigit(split2[1].charAt(0));
            
            if (!isDigit1 && !isDigit2) {
                int cmp = split1[1].compareTo(split2[1]);
                if (cmp != 0) return cmp;
                return split1[0].compareTo(split2[0]);
            }
            return isDigit1 ? 1 : -1;
        });
        return logs;
    }
}

JavaScript Lösung

zugeordnet/original
var reorderLogFiles = function(logs) {
    return logs.sort((a, b) => {
        const [id1, ...rest1] = a.split(" ");
        const [id2, ...rest2] = b.split(" ");
        const isDigit1 = !isNaN(rest1[0][0]);
        const isDigit2 = !isNaN(rest2[0][0]);
        
        if (!isDigit1 && !isDigit2) {
            const cmp = rest1.join(" ").localeCompare(rest2.join(" "));
            if (cmp !== 0) return cmp;
            return id1.localeCompare(id2);
        }
        return isDigit1 ? 1 : -1;
    });
};

Go Lösung

zugeordnet/original
package main

import (
    "sort"
    "strings"
    "unicode"
)

func reorderLogFiles(logs []string) []string {
    sort.SliceStable(logs, func(i, j int) bool {
        split1 := strings.SplitN(logs[i], " ", 2)
        split2 := strings.SplitN(logs[j], " ", 2)
        isDigit1 := unicode.IsDigit(rune(split1[1][0]))
        isDigit2 := unicode.IsDigit(rune(split2[1][0]))
        
        if !isDigit1 && !isDigit2 {
            if split1[1] != split2[1] {
                return split1[1] < split2[1]
            }
            return split1[0] < split2[0]
        }
        return !isDigit1
    })
    return logs
}

Algorithm

1⃣Разделить журналы на буквенные и цифровые.

2⃣Отсортировать буквенные журналы:

ЛексикоGraphически по содержимому.

Если содержимое одинаково, отсортировать по идентификатору.

Объединить отсортированные буквенные журналы и цифровые журналы в исходном порядке.

3⃣Вернуть окончательный результат.

😎

Stellen zu dieser Aufgabe

aktive Stellen with overlapping task tags are angezeigt.

Alle Stellen
Es gibt noch keine aktiven Stellen.