首頁  >  文章  >  後端開發  >  資料轉換:第三大字母和混亂字母

資料轉換:第三大字母和混亂字母

Susan Sarandon
Susan Sarandon原創
2024-10-05 10:32:29350瀏覽

Data Transformations: Third Maximum and Jumbled Letters

在本文中,我們將解決Perl Weekly Challenge #289 中的兩個引人入勝的任務:找到數組中的第三個不同的最大值,並打亂文本中單詞的字母,同時保留第一個和最後一個字母到位。我們將在 Perl 和 Go 中實現解決方案。

目錄

  1. 第三個最大值
  2. 混亂的字母
  3. 結論

第三個最大值

第一個任務涉及在給定的整數數組中找到第三個不同的最大值。如果第三個最大值不存在,則函數應傳回最大數。

任務說明

輸入: 整數數組,@ints。

輸出: 第三個不同的最大值或最大數(如果第三個最大值不存在)。

範例

  • 輸入: @ints = (5, 6, 4, 1)
    輸出: 4
    (不同的最大值為 6、5 和 4。)

  • 輸入: @ints = (4, 5)
    輸出: 5
    (第三個最大值不存在。)

  • 輸入: @ints = (1, 2, 2, 3)
    輸出: 1
    (不同的最大值為 3、2 和 1。)

解決方案

Perl 實現

在此實作中,我們建立一組唯一值,然後按降序對它們進行排序,以便輕鬆找到第三個最大值。


sub third_maximum {
    my @ints = @_;

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

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


實施

Go 實作遵循類似的邏輯,使用映射來捕獲唯一整數,然後對它們進行排序。


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
}


.

混亂的字母

第二個任務涉及打亂給定文本中每個單字的字母,同時確保第一個和最後一個字母保持在原位。空格和標點符號也應該保留。

任務說明

輸入: 文字字串。

輸出:輸入文字的混亂版本。

範例

  • 輸入:“根據劍橋大學的一項研究,單字中字母的順序並不重要。”
  • 輸出:(例如)“根據 Cmbraidge 大學的一項研究,它與某一行中的內容無關。” (每個單字中的字母隨機重新排列,第一個和最後一個字母不變。)

解決方案

Perl 實現

對於此任務,我們定義兩個函數:

  1. jumble_word:此函數將一個單字作為輸入,並打亂中間的字母,同時保持第一個和最後一個字母完整。如果單字不超過 3 個字母,則原樣返回。為了打亂字母,我們使用 Perl 的 List::Util 模組。
  2. jumble_text:此函數處理全文字串,將其拆分為單詞,同時保留空格和標點符號。它將 jumble_word 函數應用於每個單字,確保只有單字被打亂。

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);
}


.

實施

Go 實作採用了類似的方法,利用 math/rand 套件來打亂字母,


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)
}


.

結論

在本文中,我們探討了兩個有趣的編碼挑戰:在數組中找到第三個不同的最大值以及在文本中打亂字母。這些任務說明了不同的程式語言如何解決類似的問題,每種語言都有自己的優點和方法。我希望這些例子能激勵您應對類似的挑戰並探索 Perl 的功能並走得更遠!

您可以在 GitHub 上找到完整的程式碼,包括測試。

以上是資料轉換:第三大字母和混亂字母的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn