Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Transformasi Data: Huruf Maksimum Ketiga dan Jumbled

Transformasi Data: Huruf Maksimum Ketiga dan Jumbled

Susan Sarandon
Susan Sarandonasal
2024-10-05 10:32:29246semak imbas

Data Transformations: Third Maximum and Jumbled Letters

Dalam artikel ini, kami akan menangani dua tugasan yang menarik daripada Cabaran Mingguan Perl #289: mencari maksimum ketiga yang berbeza dalam tatasusunan dan berebut huruf perkataan dalam teks sambil mengekalkan huruf pertama dan terakhir di tempat. Kami akan melaksanakan penyelesaian dalam kedua-dua Perl dan Go.

Jadual Kandungan

  1. Maksimum Ketiga
  2. Surat Berantakan
  3. Kesimpulan

Maksimum Ketiga

Tugas pertama melibatkan mencari maksimum ketiga yang berbeza dalam tatasusunan integer tertentu. Jika maksimum ketiga tidak wujud, fungsi harus mengembalikan nombor maksimum.

Penerangan Tugas

Input: Tatasusunan integer, @ints.

Output: Maksimum ketiga yang berbeza atau nombor maksimum jika maksimum ketiga tidak wujud.

Contoh

  • Input: @ints = (5, 6, 4, 1)
    Output: 4
    (Maksimum yang berbeza ialah 6, 5 dan 4.)

  • Input: @ints = (4, 5)
    Output: 5
    (Maksimum ketiga tidak wujud.)

  • Input: @ints = (1, 2, 2, 3)
    Output: 1
    (Maksimum yang berbeza ialah 3, 2 dan 1.)

Penyelesaian

Pelaksanaan Perl

Dalam pelaksanaan ini, kami mencipta satu set nilai unik dan kemudian mengisihnya dalam tertib menurun untuk mencari maksimum ketiga dengan mudah.


sub third_maximum {
    my @ints = @_;

    my %unique = map { $_ => 1 } @ints;
    my @distinct = sort { $b <=> $a } keys %unique;

    return @distinct >= 3 ? $distinct[2] : $distinct[0];
}


Perlaksanaan Go

Pelaksanaan Go mengikut logik yang serupa, menggunakan peta untuk menangkap integer unik dan kemudian mengisihnya.


func thirdMax(ints []int) (int, error) {
    if len(ints) == 0 {
        return 0, errors.New("input slice is empty")
    }

    unique := make(map[int]struct{})
    for _, num := range ints {
        unique[num] = struct{}{}
    }

    numsSorted := make([]int, 0, len(unique))
    for num := range unique {
        numsSorted = append(numsSorted, num)
    }

    sort.Slice(numsSorted, func(i, j int) bool {
        return numsSorted[i] > numsSorted[j]
    })

    if len(numsSorted) >= 3 {
        return numsSorted[2], nil
    }
    return numsSorted[0], nil
}


.

Surat Bercampur-aduk

Tugas kedua melibatkan mengacak huruf setiap perkataan dalam teks yang diberikan sambil memastikan huruf pertama dan terakhir kekal di tempatnya. Ruang putih dan tanda baca juga harus dikekalkan.

Penerangan Tugas

Input: Rentetan teks.

Output: Versi campur aduk bagi teks input.

Contoh

  • Input: "Menurut penyelidikan di Universiti Cambridge, tidak kira dalam susunan huruf dalam sesuatu perkataan."
  • Output: (cth.) "Berdasarkan kajian di Cmbraidge Uinversity, ia tidak dapat dilihat seperti mana yang ada di dalam sesuatu." (Huruf dalam setiap perkataan disusun semula secara rawak, dengan huruf pertama dan terakhir tidak berubah.)

Penyelesaian

Pelaksanaan Perl

Untuk tugasan ini, kami mentakrifkan dua fungsi:

  1. jumble_word: Fungsi ini mengambil perkataan sebagai input dan mengacak huruf di tengah, sambil mengekalkan huruf pertama dan terakhir tetap utuh. Jika perkataan itu 3 huruf atau kurang, ia dikembalikan tidak berubah. Untuk merombak huruf, kami menggunakan modul Senarai Perl::Util.
  2. jumble_text: Fungsi ini memproses rentetan teks penuh, membahagikannya kepada perkataan sambil mengekalkan ruang putih dan tanda baca. Ia menggunakan fungsi jumble_word pada setiap perkataan, memastikan bahawa hanya perkataan yang diacak.

use List::Util 'shuffle';

sub jumble_word {
    my ($word) = @_;

    return $word if length($word) <= 3;

    my $middle  = substr($word, 1, -1);
    my @m_chars = split('', $middle);
    @m_chars    = shuffle(@m_chars);

    my $subst = join('', @m_chars);
    substr($word, 1, -1, $subst);

    return $word;
}

sub jumble_text {
    my ($text) = @_;

    my @tokens = split(/(\W+|_)/, $text);

    for my $token (@tokens) {
        if ($token =~ /^[A-Za-z]+$/) {
            $token = jumble_word($token);
        }
    }

    return join('', @tokens);
}


.

Perlaksanaan Go

Pelaksanaan Go menggunakan pendekatan yang sama, menggunakan pakej matematik/rand untuk merombak huruf,


package main

import (
    "math/rand"
    "regexp"
    "strings"
    "time"
)

func jumbleWord(word string) string {
    if len(word) <= 3 {
        return word
    }

    middle := word[1 : len(word)-1]
    chars := []rune(middle)

    rand.Seed(time.Now().UnixNano())
    rand.Shuffle(len(chars), func(i, j int) {
        chars[i], chars[j] = chars[j], chars[i]
    })

    return string(word[0]) + string(chars) + string(word[len(word)-1])
}

func jumbleText(text string) string {
    re := regexp.MustCompile(`(\W+|_)`)
    tokens := re.Split(text, -1)
    nonWordTokens := re.FindAllString(text, -1)

    var result []string

    for i, token := range tokens {
        if isAlpha(token) {
            result = append(result, jumbleWord(token))
        }
        if i < len(nonWordTokens) {
            result = append(result, nonWordTokens[i])
        }
    }

    return strings.Join(result, "")
}

func isAlpha(s string) bool {
    re := regexp.MustCompile(`^[A-Za-z]+$`)
    return re.MatchString(s)
}


.

Kesimpulan

Dalam artikel ini, kami meneroka dua cabaran pengekodan yang menyeronokkan: mencari maksimum ketiga yang berbeza dalam tatasusunan dan huruf berebut dalam teks. Tugas-tugas ini menggambarkan bagaimana bahasa pengaturcaraan yang berbeza mendekati masalah yang sama, masing-masing dengan kekuatan dan metodologinya sendiri. Saya harap contoh ini memberi inspirasi kepada anda untuk menangani cabaran yang serupa dan meneroka keupayaan Perl dan Go lebih jauh!

Anda boleh mendapatkan kod lengkap, termasuk ujian, di GitHub.

Atas ialah kandungan terperinci Transformasi Data: Huruf Maksimum Ketiga dan Jumbled. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn