面试题求救啊

第一题:给定一个字符串,请你将字符串重新编码,将连续的字符替换成“连续出现的个数+字符”。比如字符串AAAABCCDAA会被编码成4A1B2C1D2A。

第二题:在一个N*N的数组中寻找所有横,竖,左上到右下,右上到左下,四种方向的直线连续D个数字的和里面最大的值
输入描述:
每个测试输入包含1个测试用例,第一行包括两个整数 N 和 D :
3 <= N <= 100
1 <= D <= N
接下来有N行,每行N个数字d:
0 <= d <= 100

输出描述:
输出一个整数,表示找到的和的最大值

输入例子:
4 2
87 98 79 61
10 27 95 70
20 64 73 29
71 65 15 0

输出例子:
193

第三题:大家一定玩过“推箱子”这个经典的游戏。具体规则就是在一个N*M的地图上,有1个玩家、1个箱子、1个目的地以及若干障碍,其余是空地。玩家可以往上下左右4个方向移动,但是不能移动出地图或者移动到障碍里去。如果往这个方向移动推到了箱子,箱子也会按这个方向移动一格,当然,箱子也不能被推出地图或推到障碍里。当箱子被推到目的地以后,游戏目标达成。现在告诉你游戏开始是初始的地图布局,请你求出玩家最少需要移动多少步才能够将游戏目标达成。
输入描述:
每个测试输入包含1个测试用例
第一行输入两个数字N,M表示地图的大小。其中0<N,M<=8。
接下来有N行,每行包含M个字符表示该行地图。其中 . 表示空地、X表示玩家、*表示箱子、#表示障碍、@表示目的地。
每个地图必定包含1个玩家、1个箱子、1个目的地。

输出描述:
输出一个数字表示玩家最少需要移动多少步才能将游戏目标达成。当无论如何达成不了的时候,输出-1。

输入例子:
4 4
....
..*@
....
.X..
6 6
...#..
......

*##..

..##.#
..X...
.@#...

输出例子:
3
11

第四题:在一条无限长的跑道上,有N匹马在不同的位置上出发开始赛马。当开始赛马比赛后,所有的马开始以自己的速度一直匀速前进。每匹马的速度都不一样,且全部是同样的均匀随机分布。在比赛中当某匹马追上了前面的某匹马时,被追上的马就出局。 请问按以上的规则比赛无限长的时间后,赛道上剩余的马匹数量的数学期望是多少
输入描述:
每个测试输入包含1个测试用例
输入只有一行,一个正整数N
1 <= N <= 1000

输出描述:
输出一个浮点数,精确到小数点后四位数字,表示剩余马匹数量的数学期望

输入例子:
1
2

输出例子:
1.0000
1.5000

阅读 5.6k
7 个回答

第一题:

var key = "AAAABCCDAA";
var result = "";
var lastKey = "", lastKeyCount = 0, currentKey;
for(var i = 0; i < key.length; i++ ){
    currentKey = key.substr(i,1);
    if( currentKey == lastKey ){
        lastKeyCount++;
    } else {
        if( lastKey != ""){
            result += lastKeyCount + lastKey;
        }
        lastKey = currentKey;
        lastKeyCount = 1;
    }
}
//最后补全
result += lastKeyCount + lastKey;
console.log(result);

第一题(正则解法):

var key = "AAAABCCDAA";
var result = "";
var currentKey, keyCount, tempArr;
for( var i = 0 ; i < key.length; i++ ){
    currentKey = key.substr(i, 1);
    tempArr = (new RegExp('^' + currentKey + '+')).exec( key.substr(i) );
    result += tempArr[0].length + currentKey;
    i += tempArr[0].length - 1;
}
console.log(result);

第一题(终极解法):
@listenWind 的启发,写完后 和 @莲_涳栢__ 撞车了,思路一样,只是正则不一样。

var key = "AAAABCCDAA";
var result = key.replace(/(\w)\1*/ig, function($1, $2){return $1.length + $2;})
console.log(result);
// First Question
    console.log('AAAABCCDAA'.replace(/(.)\1*/g,function(s,v){return s.length + v;}));

最后一题很简单了,对于第N匹马,如果它的速度比身后的所有马速度都快,就不会被追上,因为速度是均匀随机分布的,故其剩余的概率为1/N,而每一匹马能否剩余都是独立事件,所以可以累加。

function (n){
    let exp = 0
    for (let i = 1; i <= n; i++){
        exp += 1/n;
    }
    return exp.toFixed(4);
}
  1. 比较简单的数据压缩

  2. 深搜可破

  3. 基础动态规划

  4. 这一题没有接触过类似的

第二题,写的复杂,求更好思路

    function RandomNumBoth(Min,Max){
            var Range = Max - Min;
            var Rand = Math.random();
            var num = Min + Math.round(Rand * Range); //四舍五入
            return num;
        }
    
        function t1(n,d){
            var data=[];
            for(var i=0;i<n;i++){
                var data2=[];
                for(var j=0;j<n;j++){
                    var temp=RandomNumBoth(3,100);
                    data2.push(temp);
                }
                data.push(data2);
            }
    
            var array=new Array(0,0,0,0);
            var n=data.length;
            for(var m=0;m<d;m++){
                array[0]+=data[m][m];
                array[1]+=data[m][n-1-m];
                array[2]+=data[n-1-m][m];
                array[3]+=data[n-1-m][n-1-m];
            }
            array=array.sort(compare);
            console.log(array);
            console.log(array[array.length-1]);
        }
    
        function compare(a,b) {
            return a-b;
        }

第一题

    function changeStrStyle(str) {
        var arr = str.replace(/(([^])\2*)/g, " $1").trim().split(" "),a = [];
        for (var i = 0, len = arr.length; i < len; i++) {
            a.push(arr[i].length + arr[i][0]);
        }
        return a.join("");
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题