文章目录
- 1. 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
- 2. 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
- 3. 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
1. 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
思想为: 回溯法,回溯法其实也是使用递归的。先沿着一条路走,如果走不通就回到上一层,走其他的路。这就是回溯法。当到达一个节点时,判断在满足条件的前提下递归的抵达下一个节点。
难点是:要注意数组边界的处理
public class Solution {
public boolean hasPath(char[] matrix, int rows, int cols, char[] str)
{
if(matrix==null||str==null||rows<1 ||cols<1||matrix.length!=rows*cols){
return false;
}
boolean[] visited = new boolean[rows*cols];
int pathLength = 0;
for(int i=0;i<rows ;i++){
for(int j=0;j<cols; j++){
if(hasPathCore(matrix,rows,cols,str,i,j,visited,pathLength)){
return true;
}
}
}
return false;
}
private boolean hasPathCore(char[] matrix, int rows, int cols, char[] str, int i,int j , boolean[] visited, int pathLength) {
boolean flag=false;
if(i>=0 && j>=0 && i<rows && j<cols && !visited[i*cols+j] && matrix[i*cols+j]==str[pathLength]) {
visited[i*cols+j]=true;
++pathLength;
if(pathLength==str.length){
return true;
}
flag = hasPathCore(matrix,rows,cols,str,i,j+1,visited,pathLength)||
hasPathCore(matrix,rows,cols,str,i+1,j,visited,pathLength)||
hasPathCore(matrix,rows,cols,str,i,j-1,visited,pathLength)||
hasPathCore(matrix,rows,cols,str,i-1,j,visited,pathLength);
if(!flag){
visited[i*cols+j]=false;
--pathLength;
}
}
return flag;
}
}
2. 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思想: 输出二进制中1的个数就是 n = n&(n-1),当n不等于0 时能够循环多少次就有多少个1
public class Solution {
public int NumberOf1(int n) {
int sum=0;
while(n!=0){
sum++;
n = n&(n-1);
}
return sum;
}
}
3. 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
思想:这道题需要考虑所有的用例,正数,负数,和0 。当exponent为0 的时候直接返回1 当exponent为正数的时候,递归。 a^n = a^(n/2) *a^(n/2) n为偶数,当n为奇数时,a^n = a^((n-1)/2) *a^((n-1)/2) *a 当exponent为负数的时候,先变为正数,求取之后再取倒数
public class Solution {
public double Power(double base, int exponent) {
if(exponent==0){
return 1;
}
if(exponent==1){
return base;
}
if(exponent>0){
double result = Power(base,exponent/2);
result *= result;
if(exponent%2==1){
result *= base;
}
return result;
}
if(exponent<0){
exponent = -exponent;
double result = Power(base,exponent/2);
result *= result;
if(exponent%2==1){
result *= base;
}
result = 1/result;
return result;
}
return 0.0;
}
}