Shopee虾皮0401-笔试

本来时间是7:00-9:00,但鼠鼠8:05才进来,单选多选直接一通连蒙带骗10分钟整完,主要做了三道编程题:100 100 93

1.lc61旋转链表,mid原题,这次赶时间直接用了golang,golang内置的list非常适合首尾移位操作,加个虚拟头节点避免麻烦事(AC)

package main

import "container/list"

type ListNode struct {
	Val  int
	Next *ListNode
}

/**
 * Note: 类名、方法名、参数名已经指定,请勿修改
 *
 *
 * 旋转链表
 * @param head ListNode类
 * @param k int整型
 * @return ListNode类
 */
func Rotate(head *ListNode, k int) *ListNode {
	// write code here
	nodeList := list.New()
	p := head
	for p != nil {
		nodeList.PushBack(p)
		p = p.Next
	}
	listLen := nodeList.Len()
	k = k % listLen
	for i := 0; i < k; i++ {
		ele := nodeList.Back()
		nodeList.MoveToFront(ele)
	}

	//虚拟头
	phead := &ListNode{
		Val:  0,
		Next: nil,
	}

	p = phead
	for nodeList.Len() > 0 {
		ele := nodeList.Front()
		nodeList.Remove(ele)
		nextNode := ele.Value.(*ListNode)
		p.Next = nextNode
		p = p.Next
	}
	p.Next = nil

	return phead.Next
}

2.小写字母翻转,保持单词相对位置不变,其余非小写字母位置不变,如“Shoppee 1a3c abc”,应翻转为"Seepph 1c3a cba",先用空格分割,再对单个单词进行处理。Java内置的String类封装的各种方法比较方便,并且拼接时注意使用StringBuilder提高性能(AC)

class Solution {
    /**
     * Note: 类名、方法名、参数名已经指定,请勿修改
     * <p>
     * <p>
     * 反转字符串中的小写字母,并且保证单个单词的顺序不变,其他字符的位子不变
     *
     * @param original_str string字符串
     * @return string字符串
     */
    public String reverses(String original_str) {
        // write code here
        String[] strings = original_str.split(" ");
        StringBuilder builder = new StringBuilder();
        for (String str : strings) {
            builder.append(getReverseLowStr(str));
            builder.append(" ");
        }
        builder.deleteCharAt(builder.length() - 1);
        return builder.toString();
    }

    private String getReverseLowStr(String str) {
        StringBuilder sb = new StringBuilder();
        StringBuilder strBuilder = new StringBuilder(str);
        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);
            if (ch >= 'a' && ch <= 'z') {
                sb.append(ch);
            }
        }
        sb.reverse();
        String s = sb.toString();
        int point = 0;
        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);
            if (ch >= 'a' && ch <= 'z') {
                strBuilder.setCharAt(i, s.charAt(point));
                point++;
            }
        }
        return strBuilder.toString();
    }
}

3.lol英雄价格数组,原始点券有限,问最多能买多少个英熊,注意返回买了哪些点卷,返回购买的点卷数组。不能重复买,这JB一眼01背包,这不直接双层dp?外层物品,内层倒序容量。正准备用双层dp秒,结果想了想,dp解决01背包只能求个数,他让我把具体哪个列出来,搞得鼠鼠我头大,时间剩的不多了,后面转念一想,干脆回溯爆搜算了,也是用golang省了写题时间,这B语言写工程有种吃shi的感觉,写个算法题倒可以少写不少东西(93%,代码没问题,应该是后7%超时了,欢迎大家指导剪枝方式)

package main

import "fmt"

/**
 * Note: 类名、方法名、参数名已经指定,请勿修改
 *
 *
 * 根据价格列表和当前点券数,计算出能买到的最多英雄
 * @param costs int整型 一维数组 英雄点券价格列表
 * @param coins int整型  拥有的点券
 * @return int整型一维数组
 */
var result []int
var max int
var record []int

func solution(costs []int, coins int) []int {
	// write code here
	result = make([]int, 0)
	record = make([]int, 0)
	max = 0
	n := len(costs)
	backtrack(0, n, costs, coins, 0)
	return record
}

func backtrack(index int, n int, costs []int, coins int, now int) {
	if index >= n || now >= coins {
		if now <= coins {
			if len(result) > max {
				max = len(result)
				record = make([]int, 0)
				for i := 0; i < len(result); i++ {
					record = append(record, result[i])
				}
			}
		} else {
			if len(result)-1 > max {
				max = len(result) - 1
				record = make([]int, 0)
				for i := 0; i < len(result)-1; i++ {
					record = append(record, result[i])
				}
			}
		}
		return
	}

	//0算上,1不算
	for i := 0; i < 2; i++ {
		if i == 0 {
			now += costs[index]
			result = append(result, costs[index])
			backtrack(index+1, n, costs, coins, now)
			result = result[:len(result)-1]
			now -= costs[index]
		} else {
			backtrack(index+1, n, costs, coins, now)
		}
	}
}

func main() {
	arr := make([]int, 0)
	arr = append(arr, 2)
	arr = append(arr, 1)
	arr = append(arr, 3)
	arr = append(arr, 4)
	arr = append(arr, 5)
	res := solution(arr, 10)
	fmt.Println(res)
}

今天的笔试大家参加了吗,欢迎大家来多多交流,特别是第三题,对于暴力回溯的剪枝方式以及dp解决01背包如何把拿了哪些物品列出而不是只列最大价值。大佬牛子们请多多指导!也希望可以再拿些面试机会练练手

#软件开发薪资爆料#
全部评论
大佬们麻烦多多指点,特别是01背包哪个,用dp该咋做呢?
4 回复 分享
发布于 2024-04-01 22:52 北京
第三题是不是可以用小顶堆,利用贪心策略
2 回复 分享
发布于 2024-04-15 15:50 河南
双层dp吗,单层dp就可以解决01
1 回复 分享
发布于 2024-04-14 22:09 河南
最后一题我也是回溯93%
1 回复 分享
发布于 2024-04-03 12:41 美国
昨天同样遇到了你这里第三题,用双层dp,每个位置直接是一个选用的数字的列表。 通过93%
点赞 回复 分享
发布于 2024-05-14 09:03 广东
都是核心代码模式吗?go的核心代码长什么样没关注过
点赞 回复 分享
发布于 2024-04-17 16:45 黑龙江
牛笔
点赞 回复 分享
发布于 2024-04-13 00:01 湖北
楼主收到约面了吗
点赞 回复 分享
发布于 2024-04-07 22:10 上海
😡还在卷是吧😍😍剪剪我的
点赞 回复 分享
发布于 2024-04-03 11:06 天津
佬太强啦
点赞 回复 分享
发布于 2024-04-02 09:21 四川

相关推荐

02-26 13:56
已编辑
重庆财经学院 Java
King987:你有实习经历,但是写的也太简单了,这肯定是不行的,你主要要包装实习经历这一块,看我的作品,你自己包装一下吧,或者发我,我给你出一期作品
点赞 评论 收藏
分享
03-27 16:40
已编辑
门头沟学院 C++
26学院本太难了,很多公司机筛就给我刷了。机会都难拿到如果是简历存在问题也欢迎拷打————————————————————分割线——————————————————————2026.3.4更新:发完贴之后,时不时投递又收到了不少的笔试/面试邀请。主要是之前投递简历出去之后基本上都是沉默状态,年后好转了不少timeline:2026.01.21&nbsp;文远知行笔试,半年多没刷算法题&nbsp;-&gt;挂&nbsp;(后续HR说春招可以重新安排笔试)2026.2.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;小鹏汇天&nbsp;技术一面,第二周收到结果&nbsp;-&gt;挂2026.2.12&nbsp;&nbsp;&nbsp;大众Cariad代招&nbsp;技术二面&nbsp;-&gt;Offer2026.2.28&nbsp;&nbsp;&nbsp;多益网络技术面试,由于风评太差,一直在犹豫要不要接面试&nbsp;-&gt;推迟-----------分割线-----------2026.3&nbsp;月前的某一天,临时去电网报名了二批计算机岗位的笔试2026.3.6&nbsp;从上家公司实习离职,氛围最好的一家公司,leader&nbsp;说可以帮忙转正,但是流程太长,而且我们部门据说只有一个&nbsp;hc,更想要研究生,我很有可能是会被签外包公司在这里干活,就离职了。2026.3.9&nbsp;入职新公司,大众Cariad&nbsp;以外部公司的身份进组,项目组签了三年,后续三年应该都可以在这里呆,不知道有没有希望原地跳槽。2026.3.10&nbsp;电网考试居然说我通过资格审查了,短信约我去参加资格审查,请假一天,买了&nbsp;12&nbsp;号晚上的机票回成都2026.3.15&nbsp;参加国家电网计算机类笔试2026.3.17&nbsp;电网出成绩了,感觉很低。觉得已经🈚️了2026.3.18&nbsp;收到电网面试通知,通知&nbsp;3.22-3.25&nbsp;这个时间去面试,我的岗位只招&nbsp;1&nbsp;个人。据说面试只有&nbsp;2-3&nbsp;人,不知道能不能成功----------分割线-----------2026.3.21&nbsp;电网面试结束,感觉回答的还勉勉强强,大概是2个岗位分别招1个人,一共11人面试,实际来了9人2026.3.27&nbsp;出面试成绩,满分100分,早上10:20左右发现面试成绩46,我震惊了,没截图,后面过了十分钟重新看发现面试成绩给我改成58了。但同样震惊。朋友问我是不是把面试官打了,哈哈
点赞 评论 收藏
分享
评论
13
35
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务