Golang 工場インタビュー

Golang バイト面接体験の共有

最初の面

面接官は最初に、面接は数回行われることを紹介しました

アルゴリズムの質問 1.1
整数を 2 進数に変換してから、負の数を 2 進数に変換します

たとえば、n = 1 (1:1 の 2 進数表現)

たとえば、n = 5 (5 の 2 進表現: 101)

たとえば、n = 20 (5 の 2 進表現: 10100)

たとえば、n = 31 (31 の 2 進表現: 11111)

この問題の解決策

ステップ1 *  -整数 n を受け入れるメソッドを定義します。

ステップ 2 - golangパッケージを使用してnをバイナリ表現に変換する

ステップ3 *  -変換されたバイナリ表現を返します。

package main

import (
	"fmt"
	"strconv"
)

func IntegerToBinary(n int) string {
	return strconv.FormatInt(int64(n), 2)
}
func main() {
	n := 1
	fmt.Printf("Binary Representation of %d is %s.\n", n, IntegerToBinary(n))
	n = 5
	fmt.Printf("Binary Representation of %d is %s.\n", n, IntegerToBinary(n))
	n = 20
	fmt.Printf("Binary Representation of %d is %s.\n", n, IntegerToBinary(n))
	n = 31
	fmt.Printf("Binary Representation of %d is %s.\n", n, IntegerToBinary(n))
}
PS D:\Workspace\Go\src\projects\demo> go run main.go
Binary Representation of 1 is 1.
Binary Representation of 5 is 101.   
Binary Representation of 20 is 10100.
Binary Representation of 31 is 11111.

int -> bin の変換

正の整数、負の整数、0 変換が含まれます

package main

import (
	"fmt"
	"strconv"
)

//bin表示转化后的位数
func convertToBin(n int, bin int) string {
	var b string
	switch {
	case n == 0:
		for i := 0; i < bin; i++ {
			b += "0"
		}
	case n > 0:
		//strcov.Itoa 将 1 转为 "1" , string(1)直接转为assic码
		for ; n > 0; n /= 2 {
			b = strconv.Itoa(n%2) + b
		}
		// 加0
		j := bin - len(b)
		for i := 0; i < j; i++ {
			b = "0" + b
		}
	case n < 0:
		n = n * -1
		// fmt.Println("变为正数:",n)
		s := convertToBin(n, bin)
		// fmt.Println("bin:",s)
		//取反
		for i := 0; i < len(s); i++ {
			if s[i:i+1] == "1" {
				b += "0"
			} else {
				b += "1"
			}
		}
		// fmt.Println("~bin :",b)
		//转化为整型,之后加1 这里必须要64,否则在转化过程中可能会超出范围
		n, err := strconv.ParseInt(b, 2, 64)
		if err != nil {
			fmt.Println(err)
		}
		//转为bin
		//+1
		b = convertToBin(int(n+1), bin)
	}

	return b
}
func main() {
	fmt.Println(
		convertToBin(5, 2),  //101
		convertToBin(13, 2), //1101
		convertToBin(11111, 2),
		convertToBin(0, 2),
		convertToBin(1, 2),
		convertToBin(-5, 2),
		convertToBin(-11111, 2),
	)
}

たとえば、-11111 の変換は次のようになります。

正の数になる: 11111 
bin: 10101101100111 
~bin : 01010010011000
結果: 1010010011001

正の数は元のコードで表され、負の数は補数コードで表され、補数コード = 逆コード + 1

アルゴリズム問題 1.2

株式の売買の最大利益 株式の
毎日の価格を表す配列が与えられた場合、複数回売買した場合の最大利益はいくらでしょうか?
日付が重ならない場合、複数回売買できますか? 入力: {100, 80, 120, 130, 70, 60, 100, 125} 複数回売買できます: 115 ( 80
で買い; 60 で買い、 125 で売る) ヒント: 売買のシーケンスを出力する必要はありません。最大の利益を得る必要があるだけです。
時間計算量とは何ですか。
空間計算量とは何ですか。

ワンパス方式。
トラバースするときは、0 より大きいすべての [prices[i]-prices[i-1]] を累積します。この累積された値が、返される必要がある値になります。
時間計算量: O(N)。空間複雑度: O(1)。

package main

import (
	"fmt"
)

func main() {
	arr := []int{100, 80, 120, 130, 70, 60, 100, 125}
	ret := maxProfit(arr)
	fmt.Println(ret)
}

func maxProfit(prices []int) int {
	N := len(prices)
	if N <= 1 {
		return 0
	}
	ans := 0
	for i := 1; i < N; i++ {
		ans += getMax(prices[i]-prices[i-1], 0)
	}
	return ans
}

func getMax(a int, b int) int {
	if a > b {
		return a
	} else {
		return b
	}
}
PS D:\Workspace\Go\src\projects\demo> go run main.go
115

1 回だけ取引する場合:

問題解決のアイデア:株価の最低点で買って最高値で売れば最大の利益が得られる(売買手数料に関係なく)

利益 = 販売価格 (最大値) - 購入価格 (最小値)。

コードの実装は次のとおりです。 アルゴリズムは O(n) の時間計算量を実装します。

func maxProfitOneDeal(prices []int) (profit int) {
	if len(prices) == 0 {
		return 0
	}
	purchase, sell := prices[0], prices[0] //初始化:purchase:购买,sell:卖出
	for _, price := range prices {
		if price < purchase { // 如果当前股票价格小于买入价格,那么将当前价格赋值给买入价格
			purchase = price
			sell = 0
		} else if price > sell { // 如果当前股票价格大于卖出价格,那么将当前价格赋值给卖出价格
			if sell-purchase > profit {
				profit = sell - purchase // 利润=卖出价格-买入价格
			}
		}
	}
	// fmt.Println("profit", profit)
	return profit
}
func main() {
	arr := []int{100, 80, 120, 130, 70, 60, 100, 125}
	ret := maxProfit(arr)
	fmt.Println(ret)
	ret1 := maxProfitOneDeal(arr)
	fmt.Println(ret1)
	ret2 := maxProfitMultiDeal(arr)
	fmt.Println(ret2)

}

複数回の取引で得られる最大利益:

問題解決のアイデア: 複数の取引が最も収益性が高く、毎回最低点で購入し、次に高い点で売却するだけで済みます。

数学的極値の考え方を使用して、価格配列の最大値 (売り価格) と最小値 (買い価格) を見つけます。

//forループ内で初日と最終日の株価を取り除き、配列内の最大値と最小値を求めます。

最安値点で買い、最高値点で売る;株価>最終日の購入価格の場合、最終日に売る(最高値点がない場合は、最後の最低値点で買う、それが最終販売日です)。最大の利益。(数学における極値思考)

golang コードは次のように実装されます。アルゴリズムは O(n) の時間計算量を実現します。 

//可交易多次,股票交易最大收益
func maxProfitMultiDeal(prices []int) (profit int) {
	if len(prices) == 0 {
		return 0
	}
	buy := prices[0] //买入初始值为第一天的股票价格
	for i := 1; i < len(prices)-1; i++ {
		//如果第i天的股票价格是极小值,赋值给buy,作为买入价格
		if prices[i]-prices[i-1] <= 0 && prices[i]-prices[i+1] <= 0 && prices[i] < buy {
			buy = prices[i]
			// log.Info("buy in第 i天", i)
		} else if prices[i]-prices[i-1] > 0 && prices[i]-prices[i+1] >= 0 && prices[i] > buy { //极大值点卖出
			profit += (prices[i] - buy)
			// log.Info("sell out第 i天", i)
			buy = prices[i+1]
		}
	}
	// log.Info("profit", profit)
	return profit
}

正誤問題 2.1 このコードの問題点とその解決方法

func main() {
	total := 0
	sum := 0
	for i := 1; i <= 10; i++ {
		sum += i
		go func() {
			total += i
		}()
	}
	fmt.Printf("total:%d sum %d", total, sum)
}
PS D:\Workspace\Go\src\projects\demo> go run main.go
total:0 sum 55

おすすめ

転載: blog.csdn.net/niwoxiangyu/article/details/131157170