金山笔试 金山wps 金山秋招 0927

笔试时间:2025年9月27日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题:dd爱科学

大科学家dd最近在研究转基因白菜,白菜的基因序列由一串大写英文字母构成。dd经过严谨的推理证明发现,只有当白菜的基因序列呈按位非递减形式时,这株白菜的高附加值将达到最高。于是dd开始着手修改白菜的基因序列,dd每次修改基因序列的任意位需要的代价是1,dd想知道,修改白菜的基因序列使其高附加值达到最高,所需要的最小代价是多少。

输入描述

第一行一个正整数n(1 ≤ n ≤ 1000000),表示字符串长度。 第二行一个长度为n的字符串,表示所给白菜的基因序列,保证给出字符串中仅有大写英文字母。

输出描述

输出一行,表示最小代价。

样例输入

5

ACEBF

样例输出

1

样例说明

改成ACEEF或者ACEFF,都只用改动一个字符,所需代价最小为1。

参考题解

解题思路:

  1. 问题转换:要让修改次数最少,就要让保留的字符最多。可以保留的字符必须构成一个"非递减子序列"。因此,问题转化为求最长非递减子序列的长度。
  2. 使用贪心+二分优化解法:维护一个辅助数组tails,遍历每个字符,如果能接在末尾就直接追加,否则用二分查找替换。
  3. 最终答案:字符串总长度 - 最长非递减子序列的长度 = 最小修改次数。

C++:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main() {
    int n;
    string s;
    cin >> n >> s;
    
    if (n == 0) {
        cout << 0 << endl;
        return 0;
    }
    
    vector<char> tails;
    
    for (char c : s) {
        int left = 0, right = tails.size();
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (tails[mid] > c) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        
        if (left == tails.size()) {
            tails.push_back(c);
        } else {
            tails[left] = c;
        }
    }
    
    cout << n - tails.size() << endl;
    return 0;
}

Java:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner inputReader = new Scanner(System.in);
        int sequenceLength = inputReader.nextInt();
        String dnaString = inputReader.next();
        
        if (sequenceLength == 0) {
            System.out.println(0);
            inputReader.close();
            return;
        }
        
        char[] trackingArray = new char[sequenceLength];
        int currentLength = 0;
        
        for (char character : dnaString.toCharArray()) {
            int left = 0;
            int right = currentLength;
            while (left < right) {
                int mid = left + (right - left) / 2;
                if (trackingArray[mid] > character) {
                    right = mid;
                } else {
                    left = mid + 1;
                }
            }
            
            trackingArray[left] = character;
            if (left == currentLength) {
                currentLength++;
            }
        }
        
        System.out.println(sequenceLength - currentLength);
        inputReader.close();
    }
}

Python:

n = int(input())
s = input()

if n == 0:
    print(0)
else:
    tails = []
    
    for c in s:
        left, right = 0, len(tails)
        while left < right:
            mid = left + (right - left) // 2
            if tails[mid] > c:
                right = mid
            else:
                left = mid + 1
        
        if left == len(tails):
            tails.append(c)
        else:
            tails[left] = c
    
    print(n - len(tails))

第二题:实现二分类的F-Score

实现一个函数来计算二分类问题中的F-Score。F-Score是精确率(Precision)和召回率(Recall)的加权调和平均,用于评估分类模型的性能。

输入描述

第一行输入一个数组,表示真实标签。 第二行输入一个数组,表示预测标签。 第三行输入一个浮点数,表示β参数。

输出描述

返回一个浮点数,表示计算得到的F-Score;结果保留3位小数。

样例输入

[1,1,0,0]

[1,0,0,1]

1.0

样例输出

0.500

参考题解

解题思路:

  1. 读取输入并解析数组字符串
  2. 统计TP(真正例)、FP(假正例)、FN(假反例)
  3. 计算精确率 Precision = TP/(TP+FP) 和召回率 Recall = TP/(TP+FN)
  4. 应用F-Score公式:F-Score = (1+β²)×(Precision×Recall)/(β²×Precision+Recall)

Python:

import re

# 读取输入
true_labels_str = input()
pred_labels_str = input()
beta = float(input())

# 解析数组字符串
def parse_array(s):
    s = re.sub(r'[\[\] ]', '', s)
    if not s:
        return []
    return [int(x) for x in s.split(',')]

y_true = parse_array(true_labels_str)
y_pred = parse_array(pred_labels_str)

# 计算TP、FP、FN
tp = fp = fn = 0

for i in range(len(y_true)):
    if y_true[i] == 1 and y_pred[i] == 1:
        tp += 1
    elif y_true[i] == 0 and y_pred[i] == 1:
        fp += 1
    elif y_true[i] == 1 and y_pred[i] == 0:
        fn += 1

# 计算precision和recall
precision = tp / (tp + fp) if (tp + fp) > 0 else 0.0
recall = tp / (tp + fn) if (tp + fn) > 0 else 0.0

# 计算F-Score
f_score = 0.0
beta_squared = beta * beta
denominator = (beta_squared * precision) + recall
if denominator > 0:
    f_score = (1 + beta_squared) * (precision * recall) / denominator

print(f"{f_score:.3f}")

第三题:神秘串

给定一个仅由小写英文字母组成的字

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2025 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论
进面试了吗
点赞 回复 分享
发布于 10-09 20:31 湖北

相关推荐

牛客上好像金山云的前端面经不多,来发个面经攒攒人品!希望早日能有一个offer!一面,全程40分钟左右,是一个女面试官,人很好,遇到有卡顿或者确实不会想不起来的地方都会说没事没事,一直在鼓励我1.&nbsp;自我介绍(要突出重点,说的有点乱了)2.&nbsp;开发页面常用哪些布局方式3.px,em和rem的区别4.解释一下js的闭包5.&nbsp;说打印结果for&nbsp;(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;5;&nbsp;i++)&nbsp;{setTimeout(()&nbsp;=&gt;&nbsp;{console.log(i);},&nbsp;1000)}6.普通函数和箭头函数的区别7.判断一个元素是否在可视区域中,有哪些方法进行判断8.可能会导致内存泄漏的情况9.数字精度丢失的问题,有哪些解决办法10.了解TS吗,TS中的interface和type的区别11.react中的key的作用12.react中常用的hooks13.了解react&nbsp;diff的原理吗14.vue中的data为什么要写成函数形式15.vue2和vue3的主要区别16.vue2的watch和create是谁先执行的17.vue3的watch和watchEffect的区别18.提升项目性能的方式19.TCP为什么是三次握手和四次挥手20.HTTPS为什么比HTTP安全(还问了加密方式)21.打包构建的时候用的是Webpack还是Vite22.Webpack的热更新是怎么做的23.手写(深拷贝,数组去重)二面,我是在boss投的简历,也是他给我约的面试。差不多一个小时,全程都是在问简历上的内容(实习,项目),中间涉及到某些东西问了一些八股,一点点最后让我实现入栈,出栈和获取栈中的最小值,时间复杂度为O(1)三面,leader面,他说他是前端后面转的后端,全程也是问的简历上的项目,不过问的跟底层一些,比如渲染页面时候gpu和cpu是怎么工作的?还有一些其他的具体忘记了三面后,过了两周,一直没消息,中途去boss问面试官,已读不回感觉基本凉了,然后去加了HR联系方式,问了HR和我说三面没通过,感觉聊得挺好的秋招感觉基本已经结束了,至今还是0offer,今后的路该怎么走呀...
点赞 评论 收藏
分享
评论
点赞
6
分享

创作者周榜

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