米哈游-笔试

第一题分享一种思路:

题目:任何正整数都可以表示为若干个不相等的3的幕的和或差。例如,20=27+3-9-1,30=27+3等。给定一个正整数,请你输出一个合法的表达式,请务必保证表达式只包含加号和减号,且每一项均为3的幕。为了保证答案唯一,你需要按每一项从大到小来输出。

想法:以466举例

一、转化为3进制:122021

二、考虑三种情况:(以下均为3进制表示)

(1)1后面带2的:122。考虑将122变为200-001,再转化200为1000-100

(2)2单独的:200变为1000-100

(3)1单独的:100就是3的2次

三、466(122021)转化方法

122,021

=200,021-1,000

=1000,021-100,000-1,000

=1000,000-100,000-1,000+100-10+1

=3^6-3^5-3^3+3^2-3+1

=729-243-27+9-3+1

=466

感觉比较复杂,问问大佬有没有新方法(数学佬过来看看啦)

#米哈游##米哈游笔试##米哈游实习##暑期实习#
全部评论
对于当前位i若其值为1或0则跳过,为2则向i+1进1并将i位置为-1,为3则向i+1位进1并将i置为0。输出3的i次方乘上i位的值,为0不输出。
4 回复 分享
发布于 2023-04-15 23:23 广东
func PowOfThree(n int) { res := make([]int, 0) var backTrack func(int) backTrack = func(curr int) { if curr == n { return } k, remain := 1, n-curr if remain > 0 { for k < remain { k *= 3 } } else { for k < (-remain) { k *= 3 } } if remain > 0 { if k-remain > remain { k /= 3 } res = append(res, k) backTrack(curr + k) } else { if k+remain > -remain { k /= 3 } res = append(res, -k) backTrack(curr - k) } } backTrack(0) print(n, "=") for i, v := range res { if i > 0 && v > 0 { print("+") } print(v) } println() }
点赞 回复 分享
发布于 2023-04-15 23:16 江西
大佬是什么岗啊
点赞 回复 分享
发布于 2023-04-16 15:30 新加坡
dfs好做吧,从大到小选不选,如果选加什么符号,不知道能不能记忆化(感觉不能)。
点赞 回复 分享
发布于 2023-04-17 18:27 湖北
个人想法 不保证正确:我会想怎么做可以mod3^x(通过例子表明吧) 20=27+3-9-1 20+1 = 21 mod 3 = 0 21-3 = 18 mod 9 = 0 18+9 =27 mod 27 = 0 然后可以反向去看这道问题 20 = 27+3 - 9 - 1
点赞 回复 分享
发布于 2023-07-11 16:29 广东

相关推荐

牛客279957775号:铁暗恋
点赞 评论 收藏
分享
3 10 评论
分享
牛客网
牛客企业服务