2023 秋招 趋势科技 8-5 后端笔试题总结

题目1 字符串替换

字符串替换,给定一个字符串,以及一个keys数组和values数组,keys数组和values数组相对应,在给定的字符串中,如果%中间的子串存在于keys中,则将%子串%替换为keys对应的values。

输入:

"%FILENAME%VIRUSNAME%SENDER%VIRUSNAME%FILENAME%",

["SENDER","RCPTS","SUBJECT","FILENAME","VIRUSNAME","ACTION"],

["abc@test.com","test@company.com","Test","Myfile","ICAN","Delete"]

输出:

"MyfileVIRUSNAME%balabalabalaICANFILENAME%"

思路:

使用Map记录keys和values的关系,然后使用双指针,遍历给定的字符串即可,注意细节处理!这道题当时卡在细节处理了,难倒英雄汉。。。。

代码

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

class Solution {
    public:
        string get(string my_template, vector<string>&keys,vector<string>&values){
            int n = my_template.size();
            map<string,string> mp;
            for(int i=0;i<keys.size();i++){
                mp[keys[i]] = values[i];
            }
            string ans = "";
            int pre = 0;
            int len = 0;
            for(int i=1;i<n;i++){
                if (my_template[i]=='%'){
                    if(my_template[pre] == '%'){
                        len = i-pre-1;
                        string tmp = my_template.substr(pre+1,len);
                        if(mp.count(tmp)){
                            ans+=mp[tmp];
                            pre = i+1;
                            continue;
                        }
                        len = i - pre; 
                        ans+=my_template.substr(pre,len);
                        pre = i;
                    }else{
                        len = i - pre;
                        string tmp = my_template.substr(pre,len);
                        ans+=tmp;
                        pre = i;
                    }
                }
            }
            ans+=my_template[pre];
            return ans;
        }    
};


int main(){
    Solution s ;
    vector<string> keys;
    vector<string> values;
    string my_template = "%FILENAME%VIRUSNAME%SENDER%VIRUSNAME%FILENAME%";
    keys.push_back("SENDER");
    keys.push_back("RCOTS");
    keys.push_back("SUBJECT");
    keys.push_back("FILENAME");
    keys.push_back("VIRUSNAME");
    keys.push_back("ACTION");
    values.push_back("abc@test.com");
    values.push_back("test@company.com");
    values.push_back("Test");
    values.push_back("Myfile");
    values.push_back("ICAN");
    values.push_back("Delete");
    string ans = s.get(my_template,keys,values);
    cout<<ans<<endl;
    return 0;
}

Java代码:

public class 趋势科技1 {
    /*
    字符串替换
     */
    public static void main(String[] args) {
        String my_template = "%FILENAME%VIRUSNAME%balabalabala%VIRUSNAME%FILENAME%";
        String[] keys = new String[]{"SENDER","RCPTS","SUBJECT","FILENAME","VIRUSNAME","ACTION"};
        String[] values  = new String[]{"abc@test.com","test@company.com","Test","Myfile","ICAN","Delete"};
        StringBuilder sb = new StringBuilder();
        int len = my_template.length();
        for(int i=0;i<len;i++){
            if(my_template.charAt(i)=='%'){
                boolean flag = false;
                for(int j=0;j<keys.length;j++){
                    int size = keys[j].length();
                    if(size+i+1<len
                    &&my_template.substring(i+1,size+i+1).equals(keys[j])
                    &&my_template.charAt(i+size+1)=='%'){
                        sb.append(values[j]);
                        i=i+size+1;
                        flag=true;
                        break;
                    }
                }
                if(!flag)sb.append(my_template.charAt(i));
            }else{
                sb.append(my_template.charAt(i));
            }
        }
        System.out.println(String.valueOf(sb));
    }
}

题目2 岛屿中最长的曼哈顿距离

类似于leetcode 200中求岛屿的数量,以及岛屿中最大的曼哈顿距离;

思路

暴力DFS+求解曼哈顿距离!

代码:

// Java版本
import java.util.ArrayList;

/*
    岛屿问题中再加入最长曼哈顿距离
 */
public class 趋势科技2 {
    static int max = Integer.MIN_VALUE;
    public static void main(String[] args) {
        int count = 0;
        int[][] nums = new int[][]{
                {0,0,0,0,0,1,1,1,1,1},
                {0,1,0,0,0,1,0,0,0,1},
                {0,0,0,0,0,1,0,0,0,1},
                {0,0,0,0,0,1,1,1,1,1},
                {0,0,0,0,0,0,0,0,0,0},
                {0,0,0,0,1,1,1,0,0,0},
                {0,0,0,1,1,1,1,1,0,0},
                {1,1,1,1,1,1,1,1,1,0}
        };
        boolean[][] flag = new boolean[nums.length][nums[0].length];
        for(int i=0;i< nums.length;i++){
            for(int j=0;j<nums[0].length;j++){
                if(nums[i][j]==1&&!flag[i][j]){
                    dfs(nums,i,j,new ArrayList<>(),flag);
                    count++;
                }
            }
        }
        System.out.println(count);
        System.out.println(max);
    }
    public static void dfs(int[][] nums, int i, int j, ArrayList<int[]> list,boolean[][] flag){
        //边界和判断条件
        if(i<0||j<0||i>=nums.length||j>=nums[0].length||nums[i][j]==0||flag[i][j])return;
        //这里因为要用到网格的1,所以不能设为0,添加了一个flag来做是否走过的判断
        flag[i][j] = true;
        //使用一个list<int[]> 存一个图形中所有的点,以此来算最大曼哈顿距离
        for(int[] pre : list){
            int temp = Math.abs(pre[0]-i)+Math.abs(pre[1]-j);
            max = Math.max(temp,max);
        }
        //添加这次的点到list中
        list.add(new int[]{i,j});
        //遍历四周
        dfs(nums,i+1,j,list,flag);
        dfs(nums,i,j+1,list,flag);
        dfs(nums,i-1,j,list,flag);
        dfs(nums,i,j-1,list,flag);
    }
}

C++版本:

#include<iostream>
#include<vector>
using namespace std;
int maxx = INT_MIN;
int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
void dfs(vector<vector<int> > nums, int i,int j, vector<pair<int,int> > points, vector<vector<bool> > flag){
    if(i<0||j<0||i>=nums.size()||j>=nums[0].size()||nums[i][j]==0||flag[i][j]){
        return;
    }

    flag[i][j] = true;
    for(int k=0;k<points.size();k++){
        int x = points[k].first;
        int y = points[k].second;
        int dis = abs(x-i)+abs(y-j);
        maxx = max(maxx,dis);
    }

    points.push_back(pair<int,int>(i,j));
    for(int k=0;k<4;k++){
        int dx = i+dir[k][0];
        int dy = i+dir[k][1];
        dfs(nums,dx,dy,points,flag);
    }
    return;
}

int main()
{
    int count = 0;
    vector<vector<int> > nums={...};
    vector<vector<bool> > flag;
    vector<pair<int,int> >list; 
    for(int i=0;i<nums.size();i++){
        for(int j=0;j<nums[0].size();j++){
            if(nums[i][j] == '1' && !flag[i][j]){
                dfs(nums,i,j,list,flag);
                count++;
            }
        }
    }
    cout<<count<<endl;
    cout<<maxx<<endl;
    return 0;
}

总结:

这一次是前期做的一个笔试,手比较生,继续加油吧!提高自己的做题速度!!!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值