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背包如何把拿了哪些物品列出而不是只列最大价值。大佬牛子们请多多指导!也希望可以再拿些面试机会练练手
查看12道真题和解析