知乎上小米变相约瑟夫环面试题微软解法的golang代码

原题: 一副从1到n的牌,每次从牌堆顶取一张放桌子上,再取一张放牌堆底,直到手机没牌,最后桌子上的牌是从1到n有序,设计程序,输入n,输出牌堆的顺序数组 。

微软君给的算法: 取一个1~n的数组,这里为了说明取n=5。按照题目中的规则变换,得到数组:[1 3 5 4 2],将该数组下标与值互换得到[1 5 2 4 3],即为答案。解释:[1 3 5 4 2]的意义是,经过变换,原数组中3号位置的数字现在2号槽,原数组中5号位置的数字现在3号槽... 现在已知变换后的槽存放的是1~n,故只需将下标与值互换即可得到待求数组。

// joseph
/*
# golang代码 变相约瑟夫环。知乎上一个小米面试题的微软解法(细节去知乎找找看)
#
# 原题: 一副从1到n的牌,每次从牌堆顶取一张放桌子上,再取一张放牌堆底,直到手机没牌,最后桌子上的牌是从1到n有序,设计程序,输入n,输出牌堆的顺序数组 。
#
# 微软君给的算法: 取一个1~n的数组,这里为了说明取n=5。按照题目中的规则变换,得到数组:[1 3 5 4 2],将该数组下标与值互换得到[1 5 2 4 3],即为答案。解释:[1 3 5 4 2]的意义是,经过变换,原数组中3号位置的数字现在2号槽,原数组中5号位置的数字现在3号槽... 现在已知变换后的槽存放的是1~n,故只需将下标与值互换即可得到待求数组。
#
*/
// 此代码用了list,肯定有效率问题。以后考虑改进。
// 我的golang技能生疏了不少
package main

import (
	"container/list"
	"fmt"
)

// 构成顺序数组
func make_array(n int) *list.List {
	array := list.New()
	for i := 1; i <= n; i++ {
		array.PushBack(i)
	}
	return array
}

// 生成中间数组
func count_mid_array(array *list.List) *list.List {
	mid_array := list.New()
	for array.Len() > 1 {
		t1 := array.Front()
		mid_array.PushBack(t1.Value)
		array.Remove(t1)
		t2 := array.Front()
		array.Remove(t2)
		array.PushBack(t2.Value)
	}
	mid_array.PushBack(array.Front().Value)
	return mid_array
}

// 转换中间组到最终结果
func trans_array(n int, new_array *list.List) *list.List {
	fin_array := list.New()
	for i := 1; i <= n; i++ {
		idx := 0
		for e := new_array.Front(); e != nil; e = e.Next() {
			idx++
			if e.Value == i {
				fin_array.PushBack(idx)
			}
		}
	}
	return fin_array
}

// 打印list函数
func PrintList(l *list.List) {
	if l != nil {
		fmt.Printf("[")
		for e := l.Front(); e != nil; e = e.Next() {
			fmt.Printf("%d", e.Value)
			if e.Next() != nil {
				fmt.Print(", ")
			}
		}
		fmt.Printf("]\n")
	}
}

// 约瑟夫环入口
func joseph() {
	fmt.Println("----====joseph run====----")
	var n int = 12
	array := make_array(n)
	PrintList(array)
	mid_array := count_mid_array(array)
	PrintList(mid_array)
	fin_array := trans_array(n, mid_array)
	PrintList(fin_array)
}

 

转载于:https://my.oschina.net/raddleoj/blog/1944161

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
乎中,关于2022年Spring面试的讨论有很多。Spring是一个非常流行的Java企业级开发框架,相关面试主要围绕该框架的核心概念、特性以及应用进行。 首先,一些常见的Spring面试可能涉及到IoC(控制反转)和DI(依赖注入)的概念和原理。回答此类问时,我们可以解释IoC是一种设计模式,通过将对象的创建和管理交给Spring容器来实现,这样可以提高代码的可维护性和扩展性。而DI是IoC的一种具体实现方式,通过依赖注入来实现对象之间的解耦。 其次,关于Spring的AOP(面向切面编程)也是一个常见的面试。我们可以解释AOP是一种通过将横切关注点(例如日志记录、性能监控等)与主要业务逻辑进行解耦的编程思想。Spring提供了一种基于代理模式的AOP实现方式,可以通过切面、连接点、切点和通等概念来实现对关注点的管理和处理。 此外,关于Spring MVC的问也常常出现在面试中。我们可以解释Spring MVC是Spring框架中用于开发Web应用的模块,它采用了基于MVC设计模式的思想,通过DispatcherServlet、HandlerMapping、Controller、ViewResolver等组件来实现请求的处理和响应的生成。 另外,对于Spring中的常用注解(例如@Controller、@Service、@Autowired等)的理解,以及它们在项目中的应用也是一个常见的面试。我们可以解释这些注解的作用和使用方式,说明它们可以简化开发流程、提高代码的可读性和可维护性。 总结来说,回答Spring面试主要需要对Spring框架的核心原理、概念和应用有一定的理解,并能够将其与具体的项目场景进行结合,以展示个人的实际应用能力和经验。同时,在准备面试时,也可以通过查阅相关书籍、官方文档和参与实际开发来巩固和扩展自己的识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值