「网易互娱-21前端开发工程师」笔试题 四道编程题 (仅A了一道...)

A.数组重排(过了37%左右)

题目描述

给两个整数A、B,位数N,B可以进行重排,然后满足A 没有就输出-1

测试样例

/* 
给两个整数A、B,位数N,B可以进行重排,然后满足A

/*  
3
123
322

223

3
421
123

-1
*/

做题思路

我的想法是,通过 dfs 排列组合所有 B 的情况,然后求大于 A 的最小的那个。其中还对组合进行了去重,但是只过了 37%左右。难道是数据原因?

我的代码

let n = parseInt(readline())
let res = []
let str = ''
let cnt = 0
let a = parseInt(readline())
let b = parseInt(readline())
str = b.toString()
cnt = str.length
let vis = []
let dfs = (t) => {
     
  if (t.length === cnt) {
     
    return res.push(parseInt(t))
  }
  for (let i = 0; i < str.length; i++) {
     
    if (vis[i]) continue
    vis[i] = true
    dfs(t + str[i])
    vis[i] = false
  }
}
dfs('')
res = [...new Set(res)]
let ans = Math.max(...res)
if (ans <= a) ans = -1
else {
     
  for (let i = 0; i < res.length; i++) {
     
    if (res[i] > a) {
     
      ans = Math.min(ans, res[i])
    }
  }
}
// console.log(ans)

print(ans)
// console.log(res)

B.数据压缩(ac)

题目描述

/* 字符串长度小于4 不压缩 */
/* 长度大于55,做分段压缩 */
/* a-Z 表示 4~55 */

/* 
abbbbbbAAAdcdddd
a0cbAAAdc0ad
*/

测试样例

let str = 'abbbbbbAAAdcdddd'
let str2 = 'aaaaaaaabbbbbbbbc'
let str3 =
  'BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBaaaaaaaaDD'
let ans =
  'BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBeeeeeeeeeeFYHHnjHAPQQc'
let tmp = '0ZB0tB0geFYHHnjHAPQQc'

let ans1 = 'abbbbbbAAAdcdddd'
let tmp1 = 'a0cbAAAdc0ad'
console.log(compress(ans))
console.log(compress(ans) === tmp)

console.log(compress(ans1))
console.log(compress(ans1) === tmp1)

做题思路

这题相对简单一点点… 注意 55分段那里,可能要分好几段55,不过我的代码太过冗余,应该写一个函数,看在a了,就没管了。

我的代码

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 使用题目中描述的方法,将 raw_str 压缩后返回
 * @param raw_str string字符串 未压缩的原始字符串
 * @return string字符串
 */
function compress( str ) {
     
  // write code here
  let stack = [str[0]]
let len = str.length
let res = ''
let map = new WeakMap()
let ans = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
for (let i = 4; i <= 55; i++) {
     
  map[i] = ans[i - 4]
}
for (let i = 1; i < len; i++) {
     
  if (str[i] === stack[stack.length - 1]) {
     
    stack.push(str[i])
  } else {
     
    let ch = stack[stack.length - 1]
    let size = stack.length
    if (size < 4) {
     
      while (size--) {
     
        res += ch
      }
    } else if (size >= 4 && size <= 55) {
     
      let c = map[size]
      res += '0'
      res += c
      res += ch
    } else {
     
      let cnt = Math.floor(size / 55)
      for (let i = 0; i < cnt; i++) {
     
        res += '0Z'
        res += ch
      }
      size = size % 55
      if (size < 4) {
     
        while (size--) {
     
          res += ch
        }
      } else if (size >= 4 && size <= 55) {
     
        let c = map[size]
        res += '0'
        res += c
        res += ch
      }
    }
    stack = []
    stack.push(str[i])
  }
}
while (stack.length) {
     
  let ch = stack[stack.length - 1]
  let size = stack.length
  if (size < 4) {
     
    while (size--) {
     
      res += ch
    }
  } else if (size >= 4 && size <= 55) {
     
    let c = map[size]
    res += '0'
    res += c
    res += ch
  } else {
     
    let cnt = Math.floor(size / 55)
    for (let i = 0; i < cnt; i++) {
     
      res += '0Z'
      res += ch
    }
    size = size % 55
    if (size < 4) {
     
      while (size--) {
     
        res += ch
      }
    } else if (size >= 4 && size <= 55) {
     
      let c = map[size]
      res += '0'
      res += c
      res += ch
    }
  }
  stack = []
}
return res
}
module.exports = {
     
  compress : compress
};

C.字符串转数组(0%)

题目描述

/* 
从第N+1元素开始,每个数都是前面N个数之和。
*/

测试样例

/* 
2,"011235"
[0,1,1,2,3,5]

5,"34561245892364388201628"
[34,56,12,45,89,236,438,820,1628]

2,"11111"
[]
*/

做题思路

不会…感觉有点动态规划味道…

我的代码

/* 
从第N+1元素开始,每个数都是前面N个数之和。
*/

/* 
2,"011235"
[0,1,1,2,3,5]

5,"34561245892364388201628"
[34,56,12,45,89,236,438,820,1628]

2,"11111"
[]
*/

let split_into_list = (n,s)=>{
     
  
}

D.遍地传送门(13%左右)

题目描述

/* 
S 到 E
可以传倍数,不会耗时
走路耗时为两个地点的标记值之差
S 和 E 相等时,返回 0
*/

测试样例

input:
5 28

output:
1
3
5 4 28

做题思路

前面各种改,到最后这道题还有40分钟,一开始用 js 写的好好的,但是我发现最后那个输出格式,不知道怎么输出(流下了菜鸡的泪水…)然后就改用C++快速敲了一遍。

思路是求终点的因子,但是后面提交过不了的时候,发现我不能累乘遍历,因子也是可以组合的。我淦… 于是笔试就这样结束了…

我的代码

/* 
S 到 E
可以传倍数,不会耗时
走路耗时为两个地点的标记值之差
*/

let minTime = (s,e)=>{
     
  if(s===e) return 0
  let res = []
  for(let i=2;i<=Math.sqrt(e);i++){
     
    while(e%i==0){
     
      res.push(i)
      e/=i
    }
  }
  res.push(e)
  let tmp = 1
  let minVal = Math.abs(s-res[0])
  let mid
  for(let i=0;i<res.length;i++){
     
    tmp *= res[i]
    let cur = Math.abs(s-tmp)
    if(cur<minVal){
     
      mid = tmp
    }
  }
  // let midVal =  Math.abs(e-mid)
  
  return mid
  // let t = Math.abs(e-s)
  // return Math.min(t,arr[0])
}


// let s1 = 5
// let e1 = 7
// console.log(minTime(s1,e1))

// let s1 = 6
// let e1 = 100
// console.log(minTime(s1,e1))

let s1 = 5
let e1 = 28
// console.log(minTime(s1,e1))
let mid = minTime(s1,e1)
let res = Math.min(Math.abs(s1-mid),Math.abs(e1-s1))
console.log(mid)
console.log(res)
#include
#define ll long long
#define mst(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn=1e5+5;
const ll inf = 0x3f3f3f3f;
ll n;
ll len;
string a,b;
vector<ll> vec;
ll minTime(ll s,ll e){
     
    if(s==e) return 0;
    for(ll i=2;i<=sqrt(e);i++){
     
        while(e%i==0){
     
            vec.push_back(i);
            e/=i;
        }
    }
    vec.push_back(e);
    ll tmp =1;
    ll mid;
    ll minVal = abs(s-vec[0]);
    for(ll i=0;i<vec.size();i++){
     
        tmp*=vec[i];
        ll cur = abs(s-tmp);
        if(cur<minVal){
     
            mid = tmp;
            minVal=cur;
        }
    }
    ll mid2;
    minVal = abs(s-vec[0]);
    for(ll i=0;i<vec.size();i++){
     
        tmp=vec[i];
        ll cur = abs(s-tmp);
        if(cur<minVal){
     
            mid2 = tmp;
            minVal=cur;
        }
    }
    if(abs(mid-s)>abs(mid2-s))
        return mid2;
    else return mid;
}
int main(){
     
    ll s,e;
    while(cin>>s>>e){
     
        vec.clear();
        ll mid = minTime(s,e);
        //cout<
        ll tmp = abs(s-e);
        ll res = min(abs(s-mid),tmp);
        cout<<res<<endl;
        if(res<tmp){
     
            cout<<3<<endl;
            cout<<s<<" "<<mid<<" "<<e<<endl;
        }else{
     
            cout<<2<<endl;
            cout<<s<<" "<<e<<endl;
        }
    }
}

结尾

太菜了…
如果有各位前端大佬看到这篇博客,还请请教一下,提供本菜鸡一点思路。呜呜呜,在牛客发帖投票有全A的,看来面试不存在了。

各位大佬,看到了这里请留步一下(呜呜呜…)

学如逆水行舟,不进则退

你可能感兴趣的:(「秋招清单」前端の心路历程,字符串,算法,dfs,数据结构,leetcode)