【面试算法题总结02】数组与字符串数据结构

数组与字符串数据结构:

 

例题1:二维数组中的查找

class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        if(matrix.length==0){
            return false;
        }
        int row=0,col=matrix[0].length-1;
        while(row<matrix.length&&col>=0){
            if(matrix[row][col]==target){
                return true;
            }
            if(matrix[row][col]<target){
                ++row;
            }else{
                --col;
            }
        }
        return false;
    }
}

 

例题2:替换空格

class Solution {
    public String replaceSpace(String s) {
        int count=0;
        for(int i=0;i<s.length();++i){
            if(s.charAt(i)==' '){
                ++count;
            }
        }
        int newLength=s.length()+2*count;
        //因为Java的String是不可变的,所以不能原地扩大并修改,必须new一个新字符数组。因此也没必要从后往前修改了
        char[] c=new char[newLength];
        int cIndex=0;
        for(int i=0;i<s.length();++i){
            if(s.charAt(i)!=' '){
                c[cIndex++]=s.charAt(i);
            }else{
                c[cIndex++]='%';
                c[cIndex++]='2';
                c[cIndex++]='0';
            }
        }
        return new String(c);
    }
}

 

例题3:字符串匹配

next[i] 就是子串s[0…i]的最长相等前后缀的前缀最后一位的下标

class Solution {
    public boolean patternMatching(String pattern, String value) {
        int[] next=getNext(pattern);

        int j=-1;       //初始化j为-1,表示当前还没有任意一位被匹配
        for(int i=0;i<value.length();++i){      //试图匹配text[i]
            while(j!=-1&&value.charAt(i)!=pattern.charAt(j+1)){
                j=next[j];      //不断回退,直到j回到-1或text[i]==pattern[j+1];
            }
            if(value.charAt(i)==pattern.charAt(j+1)){
                ++j;
            }
            if(j==pattern.length()-1){
                return true;
            }
        }
        return false;    
    }
    public int[] getNext(String pattern){
        int n=pattern.length();
        int[] next=new int[n];
        next[0]=-1;
        int j=-1;
        for(int i=1;i<n;++i){
            while(j!=-1&&pattern.charAt(i)!=pattern.charAt(j+1)){
                j=next[j];
            }
            if(pattern.charAt(i)==pattern.charAt(j+1)){
                ++j;
            }
            next[i]=j;
        }
        return next;
    }
}

 

例题4:字符串匹配次数

class Solution {
    public int patternMatchingCount(String pattern, String value) {
        int[] next=getNext(pattern);
        int result=0;
        int j=-1;       //初始化j为-1,表示当前还没有任意一位被匹配
        for(int i=0;i<value.length();++i){      //试图匹配text[i]
            while(j!=-1&&value.charAt(i)!=pattern.charAt(j+1)){
                j=next[j];      //不断回退,直到j回到-1或text[i]==pattern[j+1];
            }
            if(value.charAt(i)==pattern.charAt(j+1)){
                ++j;
            }
            if(j==pattern.length()-1){
                ++result;
                j=next[j];
            }
        }
        return result;    
    }
    public int[] getNext(String pattern){
        int n=pattern.length();
        int[] next=new int[n];
        next[0]=-1;
        int j=-1;
        for(int i=1;i<n;++i){
            while(j!=-1&&pattern.charAt(i)!=pattern.charAt(j+1)){
                j=next[j];
            }
            if(pattern.charAt(i)==pattern.charAt(j+1)){
                ++j;
            }
            next[i]=j;
        }
        return next;
    }
}

 

例题5:顺时针打印矩阵

class Solution {
    int[] result;
    int index=0;
    public int[] spiralOrder(int[][] matrix) {
        int n=matrix.length;
        if(n==0){
            return new int[0];
        }
        int m=matrix[0].length;
        result=new int[n*m];
        for(int start=0;2*start<n&&2*start<m;++start){
            circleOrder(start,matrix);
        }
        return result;
    }
    public void circleOrder(int start,int[][] matrix){
        int n=matrix.length,m=matrix[0].length;
        int endRow=n-start-1,endCol=m-start-1;
        for(int i=start;i<=endCol;++i){
            result[index++]=matrix[start][i];
        }
        for(int i=start+1;i<=endRow;++i){
            result[index++]=matrix[i][endCol];
        }
        if(start<endRow){
            for(int i=endCol-1;i>=start;--i){
                result[index++]=matrix[endRow][i];
            }
        }
        if(start<endCol){
            for(int i=endRow-1;i>start;--i){
                result[index++]=matrix[i][start];
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值