招商银行开发岗算法题golang实现

Posted Kris_u

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了招商银行开发岗算法题golang实现相关的知识,希望对你有一定的参考价值。

1、给出一个非空的字符串,判断这个字符串是否是由它的一个子串进行多次首尾拼接构成的。例如,"abcabcabc"满足条件,因为它是由"abc"首尾拼接而成的,而"abcab"则不满足条件。

思路:分为若干份,从2等分开始, 子串的最大长度为字符串的1/2,把相同的子串用空字符串替换,若替换后的字符串为空,则该字符串满足:是由子串首位拼接而成的条件。

func subString(s string) (flag bool) 
	flag = true
	for i := 1; i < len(s)/2+1; i++  //分为若干份2等分开始,子串的最大长度为字符串的1/2
		sub := s[0:i]
		str := strings.ReplaceAll(s, sub, "")
		if str == "" 
			return
		
	
	return

2、给出一个整数n,将n分解为至少两个整数之和,使得这些整数的乘积最大化,输出能够获得的最大的乘积。

例如:2=1+1,输出1;10=3+3+4,输出36。

解题思路: //为了获取最大化的乘积,需要将n拆分更多的3,

令a=n/3;b=n%3;则n=a个3之和+b;

b分为0,1,2;

当b=0时,max=3^a;

当b=2时,max=3^a*2,若向前借一个2,变成2+3=5,5的最大乘积为3*2=6,为最大乘积,所以不变。

当b=1时,因为拆分为1,所以向前借一个3,变成3+1=4,4的最大乘积为2*2=4,若按原来为3*1=3就小了;所以max=3^(a-1)*4

再讨论n:当n<=3,max=n-1;当n>=4,按n%3=0,1,2余数分类。

func integerBreak(n int) (max float64) 
	if n == 2 
		max = 1
	
	if n == 3 
		max = 2
	
	if n > 3 
		b := n % 3
		if b == 0 
			max = math.Pow(float64(3), float64(n/3))
		 else if b == 1 
			max = math.Pow(float64(3), float64(n/3-1)) * 4
		 else if b == 2 
			max = math.Pow(float64(3), float64(n/3)) * 2
		
	
	return

3、从非负整数序列 0, 1, 2, ..., n中给出包含其中n个数的子序列,请找出未出现在该子序列中的那个数。

输入描述:

输入为n+1个非负整数,用空格分开。

其中:首个数字为非负整数序列的最大值n,后面n个数字为子序列中包含的数字。

输出描述:

输出为1个数字,即未出现在子序列中的那个数。

输入例子1:

3 3 0 1

输出 2

思路是:有的数将对应位置标志位负数-1,主要避免是0的情况, 不用处理最后的n, 如果前面没输出停止,直接输出即可;

func unpresentElem(num []int) (elem int) 
	arr := make([]int, len(num))
	for _, v := range num 
		arr[v] = -1
	
	for index, value := range arr 
		if value != -1 && index != 0 

			return index
		
	
	return

4、小招喵喜欢在数轴上跑来跑去,假设它现在站在点n处,它只会3种走法,分别是:

1.数轴上向前走一步,即n=n+1

2.数轴上向后走一步,即n=n-1

3.数轴上使劲跳跃到当前点的两倍,即n=2*n

现在小招喵在原点,即n=0,它想去点x处,快帮小招喵算算最快的走法需要多少步?

输入描述:     小招喵想去的位置x

输出描述:     小招喵最少需要的步数

输入例子:3            输出:3

思路-递归:设小招喵要去的位置为x,最小的步数为f(x),则f(x)满足如下关系:

1.f(0) = 0;     2.f(1) = 1;      且f(x)存在如下递推关系:

当x为偶数时,f(x) = f(x/2)+1;

当x为奇数时,f(x) = min(f((x-1)/2),f((x+1)/2))+2;

此外,还需考虑到x为负数的情况,转化为整数即可。

func minStep(x int) (steps int) 
	if x < 0 
		x = int(math.Abs(float64(x)))
	
	if x == 0 
		steps = 0
	
	if x == 1 
		steps = 1
	 else 
		if x%2 == 0 
			steps = minStep(x/2) + 1
		 else 
			step1 := minStep((x - 1) / 2)
			step2 := minStep((x + 1) / 2)
			steps = min(step1, step2) + 2
		
	
	return


func min(a, b int) int 
	if a <= b 
		return a
	 else 
		return b
	

5、不想出差的HR:  

按照卡中心校园招聘的要求,HR小招和小商需要从三个科室中(分别为A、B、C)抽派面试官去往不同城市。
两名HR按照以下规定轮流从任一科室选择面试官:每次至少选择一位,至多选择该科室剩余面试官数。最先选不到面试官的HR需要自己出差。
假设HR小招和小商都不想出差且每次选择都采取最优策略,如果是小招先选,写一个函数来判断她是否需要出差。如果不需要出差,请给出第一步的最优策略。

输入描述:
输入为三个正整数,分别代表三个科室的面试官人数,用英文逗号分隔

输出描述:
若小招需要出差,则输出:1;
若小招不需要出差,则输出:第一步选择的科室名称和选择人数,用英文逗号分隔

输入例子1:             1,8,9

输出例子1:               1

输入例子2:              2,0,4

输出例子2:              C,2
参考:(100条消息) 不想出差的HR_ac@zhui的博客-CSDN博客

思路:典型的Nim游戏,记p = s[0]^s[1]…s[n-1],若p为0,局面为P局面,即失败;否则,我们找到与p最高位1相同的s[i],将p与s[i]异或,最终的答案ans满足p^(s[i]-ans)=0

//*  nim 游戏
func nim(nums []int) 
	room := []string"A", "B", "C"
	ans := 0
	for i := 0; i < len(nums); i++ 
		ans ^= nums[i]
	

	if ans == 0 
		fmt.Printf("%d\\n", 1)
	 else 
		// 第一个先手的就是 异或后 结果小于 当前这个数的,说明没有取完
		for i := 0; i < len(nums); i++ 
			num := ans ^ nums[i]
			if nums[i]-num >= 0 
				fmt.Printf("%s,%d\\n", room[i], (nums[i] - num))
				break
			
		
	

6、年会抢玩偶游戏

某公司年会上,组织人员安排了一个小游戏来调节气氛。游戏规则如下:N个人参与游戏,站成一排来抢工作人抛来的M个小玩偶。为了增加游戏的趣味和难度,规则规定,参与游戏的人抢到的礼物不能比左右两边的人多两个或以上,否则会受到一定的惩罚。游戏结束时拥有玩偶最多的人将获得一份大奖。
假设大家都想赢得这份大奖,请问站在第K个位置的小招在赢得游戏时,最多能拥有几个玩偶?
输入描述:
输入为用空格分隔的3个正整数,依次为:参与游戏人数N、玩偶数M、小招所在位置K
输出描述:
输出为1个正整数,代表小招最多能够拥有的玩偶数。若没有,则输出0。

2 2 2

1

算法思想:

想使得第k位的小招在不违反规则的情况下赢得游戏,那么小招与相邻参与人员的玩偶数只能依次递减1个。小招的玩偶数从最多m个依次递减,当所有人玩偶总和<=玩偶数m时,小招将获得大奖。

func dollGame(n, m, k int) (doll int) 
	//游戏人数N、玩偶数M、小招所在位置K
	if n == 0 || m == 0 || k <= 0 || k > n 
		fmt.Printf("小招拥有的玩偶数为:%d\\n", 0)
		return
	 else 
		for max := m; max >= 0; max-- 
			sum := max  //小招玩偶数
			for i := 1; i <= k-1; i++   //小招前面k-1个人的玩偶数之和
				if max-i > 0 
					sum += max - i
				
			
			for i := 1; i <= n-k; i++    //小招后面n-k个人的玩偶数之和
				if max-i > 0 
					sum += max - i
				
			
            //小招的玩偶数从最多m个依次递减,当所有人玩偶总和<=玩偶数时,小招赢得了游戏的胜利
			if sum <= m    
				fmt.Printf("小招拥有的玩偶数为:%d\\n", max)
				return max
			
		
	
	return

测试代码:

package main

import (
	"fmt"
	"math"
	"strings"
)

func main() 
	index := binary_search(3, []int1, 2, 3, 4, 5, 6, 7, 8, 9)
	fmt.Println("Hello World!", index)
	s1 := "abaaba"
	s2 := "abcabcabc"
	s3 := "babb"
	flag1 := subString(s1)
	flag2 := subString(s2)
	flag3 := subString(s3)
	fmt.Println("flag1,flag2,flag3", flag1, flag2, flag3)
	max := integerBreak(5)
	fmt.Println("max", max)
	step := minStep(3)
	fmt.Println("minimumStep", step)

	//
	number := notExistElem([]int3, 3, 0, 1)
	fmt.Println("number", number)
	nim1 := []int2, 0, 4
	nim2 := []int1, 8, 9
	nim(nim1)
	nim(nim2)

	dollGame(2, 2, 2)

输出:

i 0 0 9
i 1 0 4
Hello World! 2
s, sub,str abaaba a bb
s, sub,str abaaba ab aa
s, sub,str abaaba aba 
s, sub,str abcabcabc a bcbcbc
s, sub,str abcabcabc ab ccc
s, sub,str abcabcabc abc 
s, sub,str babb b a
s, sub,str babb ba bb
flag1,flag2,flag3 true true true
max 6
minimumStep 3
arr [0 0 0 0]
number 2
C,2
1
小招拥有的玩偶数为:1
成功: 进程退出代码 0.

以上是关于招商银行开发岗算法题golang实现的主要内容,如果未能解决你的问题,请参考以下文章

双非硕士的辛酸求职之旅--谈谈我是如何同时找到JavaPythonGo等开发岗和国企银行的offer

百度校园招聘历年经典面试题汇总:开发测试岗

最新整理:字节跳动历年Java中高级面试题全收录!后台开发JAVA岗

银行的信息技术部的主要工作是啥?

10家银行大数据岗面试经历,已拿offer,解决北京户口

四面美团开发岗,面试题分享