Baidu 2024 Summer Internship バックエンドアルゴリズムの質問の詳細な説明


これは、Baidu の 2024 年夏季インターンシップのバックエンド ポジションの最初の筆記試験で、合計 15 の多肢選択問題、5 つの多肢選択問題、および 3 つのプログラミング問題があります. 多肢選択問題には、データベース、コンピューター ネットワークが含まれます, オペレーティング システム, 言語の基礎, 補足コード, ハッシュ アルゴリズム, Linux, データ構造, 数学など. 2 時間かかります, 私は go 言語を使用します. 最初の 2 つのプログラミングの質問は非常に単純であり、最後の質問は非常に簡単です.短いですが、実は奥が深いです。早速、行きましょう!

コーディング1

トピックの説明

Xiaohong はひもを手に入れました。彼女は、このひもを並べ替えて「Baidu」のひもを形成できるかどうかを知りたがっていますか?

注: 大文字と小文字の両方が同じである必要があります。

問い合わせのグループが t あります。

説明を入力

最初の行は、問い合わせの数を表す正の整数 t を入力します。

次の t 行では、各行に英字のみを含む文字列が入力されます。

すべての文字列の長さの合計が 200,000 を超えないことが保証されています。

出力の説明

クエリごとに、1 行の回答を出力します。並べ替えて「百度」を構成できる場合は「はい」、そうでない場合は「いいえ」を出力する。

問題解決のアイデア

メイン関数では、最初にクエリ カウント t を読み取ります。次に、クエリごとに文字列を読み取り、Form 関数を呼び出して、"Baidu" 文字列を再配置して構成できるかどうかを確認します。true を返す場合は「はい」を出力し、それ以外の場合は「いいえ」を出力します。

Form 関数では、 Map: freq を使用して、入力文字列内の各文字の出現回数をカウントします。次に、「Baidu」を形成するのに十分な文字があるかどうかを確認します。具体的には、必要な文字を Map に格納し、Map を走査して各文字が Map に表示されているかどうかを確認します。どの文字も表示されない場合は、「Baidu」を形成できないことを意味し、false を返します。それ以外の場合は true を返します。

詳細コード

package main
​
import (
   "bufio"
   "fmt"
   "os"
   "strconv"
)
​
func main() {
   scanner := bufio.NewScanner(os.Stdin)
   scanner.Scan()
   t,_:=strconv.Atoi(scanner.Text())
   for i:=0;i<t;i++{
      scanner.Scan()
      s := scanner.Text()
      if Form(s){
         fmt.Println("Yes")
      }else {
         fmt.Println("No")
      }
   }
}
func Form(s string)bool{
   freq :=make(map[rune]int)
   for _,c := range s{
      freq[c]++
   }
   if freq['B']==1 && freq['a']==1 && freq['i']==1 && freq['d']==1 && freq['u']==1{
      return true
   }
   return false
}

二 Coding2

トピックの説明

整数 x が与えられた場合、回文部分文字列の数が正確に x である、「r」、「e」、「d」の 3 文字だけで構成される文字列を作成してください。

文字列の長さは 10 の 5 乗を超えてはなりません。

説明を入力

正の整数 x。

1<x<10の9乗

出力の説明

10 の 5 乗を超えてはならない、「r」、「e」、「d」の 3 文字のみで構成される文字列を出力します。複数のソリューションがある場合、出力は任意になる可能性があります。

問題解決のアイデア

まず、整数 x を読み込みます。

x が 1 の場合、"r" は回文であるため、"r" を直接出力できます。

それ以外の場合は、"r"、"e"、および "d" で構成される文字列を作成して、文字列に正確に x 個の回文部分文字列が存在するようにする必要があります。

「r」、「e」、「d」の 3 文字で構成される回文部分文字列には、「r」、「e」、「d」、「ee」、「rr」、「dd」、「9」しかないことがわかります。 「redd」、「drrd」、および「erde」の。

k/2 個の「redd」と (k+1)/2 個の「red」で構成される文字列を作成できます。ここで、「/」は除数を表します。

たとえば、x が 3 に等しい場合、3 つの回文部分文字列で構成される文字列を作成する必要があります。最初に 2 つの回文部分文字列が必要であることを計算してから、「redd」と「red」で構成される文字を作成できます。文字列、つまり「reddred」から、余分な文字を削除して「red」を取得します。

最後に、Go 標準ライブラリの strings.Repeat 関数を使用して、"redd" で構成される部分文字列を作成し、文字列スライスによって冗長な文字を削除して、長さ x の文字列を取得できます。

詳細コード

package main
​
import (
    "fmt"
    "strings"
)
​
func main() {
    var x int
    fmt.Scan(&x)
    if x == 1 {
        fmt.Println("r")
        return
    }
    palindromeCount := (x + 1) / 2
    palindrome := strings.Repeat("red", palindromeCount)[:x]
    fmt.Println(palindrome)
}

3つのコーディング3

トピックの説明

Xiaohong は木を手に入れ、それぞれの節を赤または青に染めました。

Xiaohong は、各エッジの重みを次のように定義しています。

Xiaohong が知りたいのは、すべての辺の重みの合計は?

説明を入力

最初の行は、ノードの数を表す正の整数 n を入力します。

2 行目は長さ n の文字列を入力し、'R' と B のみで構成されます。

i 番目の文字が「R」の場合はノード i が赤く、「B」の場合は青く染められることを意味します。

次の n-1 行では、各行に 2 つの正の整数 u と U を入力します。これは、ノードがエッジによってノード U に接続されていることを意味します。

1≦n≦200000

出力の説明

すべてのノードの重みの合計を表す正の整数。

問題解決のアイデア

コードのアイデア:

node構造を定義します。各ノードには色と隣接リストが含まれます。

ノード情報と色を読み込み、隣接リストを作成します。

ツリー全体が DFS の方法でトラバースされ、各ノードについて、そのサブツリー内の赤のノードと青のノードの数がカウントされ、最後にすべてのノードの重みの合計が計算されます。

具体的には、各ノード に対してu、最初にそれ自体の色を数え、次にその隣接リストをトラバースします。隣接点が の親ノードvでないuルートとするサブツリーを再帰的vに、サブツリー内の赤いノードを の数と比較します青色のノードがノードの とのカウンターu追加され、最後にの差の絶対値が回答に追加されます。red[u]blue[u]red[u]blue[u]

最後に、すべてのノードの重みの合計が出力されます。

詳細コード

package main
​
import (
   "bufio"
   "fmt"
   "os"
)
​
type node struct {
   color byte
   edges []int
}
func abs(x int) int {
   if x < 0 {
      return -x
   }
   return x
}
​
func dfs(u int, parent int, nodes []node, red, blue []int, ans *int) {
   if nodes[u].color == 'R' {
      red[u]++
   } else {
      blue[u]++
   }
   for _, v := range nodes[u].edges {
      if v != parent {
         dfs(v, u, nodes, red, blue, ans)
         red[u] += red[v]
         blue[u] += blue[v]
      }
   }
   *ans += abs(red[u] - blue[u])
}
​
func main() {
   var n int
   fmt.Scanln(&n)
​
   nodes := make([]node, n)
   colors := make([]byte, n)
   for i := 0; i < n; i++ {
      fmt.Scanf("%c", &colors[i])
      nodes[i].color = colors[i]
   }
   scanner := bufio.NewScanner(os.Stdin)
   scanner.Split(bufio.ScanWords)
   for i := 0; i < n-1; i++ {
      var u, v int
      scanner.Scan()
      fmt.Sscan(scanner.Text(), &u)
      scanner.Scan()
      fmt.Sscan(scanner.Text(), &v)
      u--
      v--
      nodes[u].edges = append(nodes[u].edges, v)
      nodes[v].edges = append(nodes[v].edges, u)
   }
​
   red := make([]int, n)
   blue := make([]int, n)
   ans := 0
   dfs(0, -1, nodes, red, blue, &ans)
   fmt.Println(ans)
}

テスト:

入力:

4

BBRR

1 2

3 2

4 1

出力

2

おすすめ

転載: blog.csdn.net/weixin_53795646/article/details/129557635