欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > 【面试经典150】day 9

【面试经典150】day 9

2025/2/25 21:16:57 来源:https://blog.csdn.net/m0_73629042/article/details/143275261  浏览:    关键词:【面试经典150】day 9

目录

1.Z 字形变换 

2.找出字符串中第一个匹配项的下标

3.文本左右对齐

1.Z 字形变换 

class Solution {public String convert(String s, int numRows) {//明明是N字形变换if(numRows<2) return s;//rows是可扩展的字符串数组List<StringBuilder>rows=new ArrayList<StringBuilder>();for(int i=0;i<numRows;i++) rows.add(new StringBuilder());int i=0,flag=-1;for(char c:s.toCharArray()){rows.get(i).append(c);if(i==0||i==numRows-1) flag=-flag;i+=flag;}StringBuilder ret=new StringBuilder();for(StringBuilder row:rows) ret.append(row);return ret.toString();}
}

2.找出字符串中第一个匹配项的下标

KMP匹配算法 

我爱卡尔

class Solution {public int strStr(String haystack, String needle) {//KMP算法int m=needle.length();//当needle是空字符串时返回0if(m==0){return 0;}int n=haystack.length();if(n<m){return -1;}int i=0;int j=0;while(i<n-m+1){//找到首字母相等while(i<n&&haystack.charAt(i)!=needle.charAt(j)){i++;}if(i==n){//没有首字母相等的return -1;}//遍历后续字符,判断是否相等i++;j++;while(i<n&&j<m&&haystack.charAt(i)==needle.charAt(j)){i++;j++;}if(j==m){//找到return i-j;}else{//未找到i-=j-1;j=0;}}return -1;}
}

3.文本左右对齐

class Solution {//答案列表List<String> ret=new ArrayList<>();//记录每个单词的长度,方便后续补齐空格操作int [] lens;//替代maxWidth,减少函数传参int maxRowLen;public List<String> fullJustify(String[] words, int maxWidth) {maxRowLen=maxWidth;int n=words.length;//1.记录每个单词的长度lens=new int[n];for(int i=0;i<n;i++){lens[i]=words[i].length();}//2.单词分组,确定哪写单词在哪行int rowLen=0;for(int i=0;i<n;i++){int start=i;while(i<n&&rowLen+lens[i]<=maxRowLen){rowLen+=(lens[i]+1);i++;}int end=--i;//[start,end]对应的单词组成一行,加入答案addAns(words,start,end);rowLen=0;}return ret;}private void addAns(String[] words,int start,int end){StringBuilder sb=new StringBuilder();//情况一:一行只有一个单词,直接空格补齐if(start==end){sb.append(words[start]);int space=maxRowLen-lens[start];for(int j=1;j<=space;j++){sb.append(" ");}ret.add(sb.toString());return;}//情况二:如果是最后一行,左对齐,即每个单词间一个空格,最后空格补齐if(end==words.length-1){int space=maxRowLen;for(int i=start;i<end;i++){sb.append(words[i]).append(" ");space-=(lens[i]+1);}sb.append(words[end]);space-=lens[end];for(int j=1;j<=space;j++){sb.append(" ");}ret.add(sb.toString());return;}//情况三:一般情况// 思路:统计要插入的总空格数spaceAll //      -> 计算单词间能够平分的空格数spaceMean//      -> 计算剩余空格数spaceLast,并从前往后分配// 总空格数int spaceAll=maxRowLen;for(int i=start;i<=end;i++){spaceAll-=lens[i];}  //平均空格数int spaceMean=spaceAll/(end-start);//剩余空格数int spaceLast=spaceAll-spaceMean* (end - start);for (int i = start; i < end; i++) {sb.append(words[i]);// 在每个单词后面插入平均空格数for (int j = 1; j <= spaceMean; j++) {sb.append(" ");}// 如果有剩余空格数,插一个if (spaceLast > 0) {sb.append(" ");spaceLast--;}}sb.append(words[end]);ret.add(sb.toString());}
}

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词