A.数组重排(过了37%左右)
题目描述
给两个整数A、B,位数N,B可以进行重排,然后满足A<B的最小B
没有就输出-1
测试样例
/*
给两个整数A、B,位数N,B可以进行重排,然后满足A<B的最小B
没有就输出-1
*/
/*
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<bits/stdc++.h>
#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<<mid<<endl;
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的,看来面试不存在了。
各位大佬,看到了这里请留步一下(呜呜呜…)
学如逆水行舟,不进则退