您的位置:首页 > 职场人生

程序员面试金典:机器人走方格II、魔术索引I

2017-07-23 08:56 197 查看

1.机器人走方格II

题目描述

有一个XxY的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。注意这次的网格中有些障碍点是不能走的。

给定一个int[][] map(C++ 中为vector >),表示网格图,若map[i][j]为1则说明该点不是障碍点,否则则为障碍。另外给定int x,int y,表示网格的大小。请返回机器人从(0,0)走到(x - 1,y - 1)的走法数,为了防止溢出,请将结果Mod 1000000007。保证x和y均小于等于50


动态规划版本1

import java.util.*;

public class Robot {
public int countWays(int[][] map, int x, int y) {
int [][]dp=new int[x][y];
for(int i=0;i<x;i++){
if(map[i][0]==1){
dp[i][0]=1;
}else{
//否则dp[i][0]=0,后面的则访问不到了,用break结束
dp[i][0]=0;
break;
}
}

for(int i=0;i<y;i++){
if(map[0][i]==1){
dp[0][i]=1;
}else{
dp[0][i]=0;
break;
}
}

//遍历格子
for(int i=1;i<x;i++){
for(int j=1;j<y;j++){
if(map[i][j]==1){
dp[i][j]=(dp[i-1][j]+dp[i][j-1])%1000000007;
}else{
dp[i][j]=0;
}
}
}
return dp[x-1][y-1];
}
}

动态规划版本2

牛客网小伙伴提供

import java.util.*;

public class Robot {
public int countWays(int[][] map, int x, int y) {
int dp[][]=new int[x][y];
for(int i=0;i<x;i++)
for(int j=0;j<y;j++)
{
if(map[i][j] != 1)dp[i][j] = 0; // 不能走,就是方法数==0
else if(i==0 && j==0)
dp[i][j] = 1; // 起点,1种走法
else if(i==0 && j!=0)
dp[i][j] = dp[i][j-1]; // 上边沿:只能从左边来
else if(i!=0 && j==0)
dp[i][j] = dp[i-1][j]; // 左边沿:只能从上边来
else
dp[i][j] = (dp[i-1][j]+dp[i][j-1])%1000000007; // 其他点:左边+上边
}
return dp[x-1][y-1];
}
}


2.魔术索引I

题目描述

在数组A[0..n-1]中,有所谓的魔术索引,满足条件A[i]=i。给定一个升序数组,元素值各不相同,编写一个方法,判断在数组A中是否存在魔术索引。请思考一种复杂度优于o(n)的方法。

给定一个int数组A和int n代表数组大小,请返回一个bool,代表是否存在魔术索引。
测试样例:
[1,2,3,4,5]

返回:false


二分查找

【运行时间:50ms  占用内存:1092k】

import java.util.*;

public class MagicIndex {
public boolean findMagicIndex(int[] A, int n) {
if(A==null||n==0)	return false;
int start=0;
int end=n-1;
while(start<=end){
int mid=(start+end)/2;
if(mid<A[mid]){
end=mid-1;
}else if(mid>A[mid]){
start=mid+1;
}else{
return true;
}
}
return false;
}
}


递归版本

【运行时间:78ms  占用内存:11264k】
import java.util.*;

public class MagicIndex {
public boolean findMagicIndex(int[] A, int n) {
if(A==null||n==0)	return false;
return findIndex(A,0,n-1);
}

public boolean findIndex(int A[],int start,int end){
if(start>end)	return false;
int mid=(start+end)/2;
if(mid==A[mid]){
return true;
}
if(mid<A[mid]){
return findIndex(A,start,mid-1);
}else{
return findIndex(A,mid+1,end);
}
}
}

直接遍历

【运行时间:89ms  占用内存:11652k】
import java.util.*;

public class MagicIndex {
public boolean findMagicIndex(int[] A, int n) {
if(A==null||n==0)	return false;
for(int i=0;i<n;i++){
if(A[i]==i)
return true;
}
return false;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息