题目一:
描述
对于一个长度为 n 字符串,我们需要对它做一些变形。
首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把这个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。
比如"Hello World"变形后就变成了"wORLD hELLO"。
数据范围: 1\le n \le 10^61≤n≤10
6
, 字符串中包括大写英文字母、小写英文字母、空格。
进阶:空间复杂度 O(n)O(n) , 时间复杂度 O(n)O(n)
思路:
需要用到的知识点:
Java中的我们可以利用split把字符串按照指定的分割符进行分割,然后返回子字符串数组
将一个字符串分割为子字符串,然后将结果作为字符串数组返回。
注意事项
在java.lang包中有String.split()方法,返回是一个数组。
使用时要注意参数如果是特殊符号的话要进行转义。
1、“.”和“|”都是转义字符,必须得加"“;
如果用“.”作为分隔的话,必须是如下写法:
String.split(”.“),这样才能正确的分隔开,不能用String.split(”.“);
如果用“|”作为分隔的话,必须是如下写法:
String.split(”|“),这样才能正确的分隔开,不能用String.split(”|");
2、如果在一个字符串中有多个分隔符,可以用“|”作为连字符,比如:“acount=? and uu =? or n=?”,把三个都分隔出来,可以用
String.split(“and|or”);
3、public String[] split(String regex,int limit)根据匹配给定的正则表达式来拆分此字符串。
此方法返回的数组包含此字符串的每个子字符串,这些子字符串由另一个匹配给定的表达式的子字符串终止或由字符串结束来终止。数组中
的子字符串按它们在此字符串中的顺序排列。如果表达式不匹配输入的任何部分,则结果数组只具有一个元素,即此字符串。
方法一:
package com.company.day01;
/*
题目要求:
* 输入字符串:
"This is a sample",16
返回值:
"SAMPLE A IS tHIS"*/
public class Solution1 {
public static void main(String[] args) {
Solution1 solution1 = new Solution1();
String res = solution1.trans("This is a sample", 16);
System.out.println(res);
}
/**
*
* @param s
* @param n
* @return
*/
public String trans(String s, int n) {
//第一步:先做容易的大小写转换,所有下小写颠倒
if(n == 0)
return s;
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < n; i++) {
//如果是大写
if(s.charAt(i) >= 'A' && s.charAt(i) <= 'Z'){
//stringBuilder用于将转换后的字母串起来
stringBuilder.append( (char)(s.charAt(i) + 32) );
}else if(s.charAt(i) >= 'a' && s.charAt(i) <= 'z'){
stringBuilder.append( (char)(s.charAt(i)-32) );
}else {
stringBuilder.append(s.charAt(i));//串空格
}
}
//stringBuilder存的是大小写转换后的字符串
//第二步:整个字符串反转
StringBuilder reverse = stringBuilder.reverse(); //ELPMAS ---
//第三步:每一个单词内部进行反转
for (int i = 0; i < n; i++) {
int j = i; //j指针 从 i位置开始遍历
while(j <n && reverse.charAt(j) != ' '){//j 指针右移,出了循环就证明标记处一个单词的结尾位置+1
j++;
}
String tempWord = reverse.substring(i, j);//截取每一个单词
StringBuffer bufferWord = new StringBuffer(tempWord);//每一个单词的StringBuffer
reverse.replace(i, j, bufferWord.reverse().toString());//将反转后的单词替换掉原先的单词
i = j; //i指针 跳跃到 j 位置并重合
}
return reverse.toString();
}
}
方法二:
package com.company.day01;
import java.util.ArrayList;
import java.util.List;
/*
题目要求:
* 输入字符串:
"This is a sample",16
返回值:
"SAMPLE A IS tHIS"*/
public class Solut2 {
public static void main(String[] args) {
Solut2 solut2 = new Solut2();
String this_is_a_sample = solut2.trans("nowcoder",8);
System.out.println(this_is_a_sample);
}
/**
*
* @param s
* @param n
* @return
*/
public String trans(String s, int n) {
//第一步:利用str.split将字符串分割成字符数组
String[] strings = s.split(" ");//将字符串分割成字符数组:
//第二步:倒序取出字符串数组
StringBuffer res = new StringBuffer();
for (int i = strings.length-1; i >= 0; i--) {
//System.out.println(strings[i]);
//大小写转换
StringBuffer stringWord = new StringBuffer(strings[i]);
//遍历单词sample
for (int j = 0; j < stringWord.length(); j++) {//遍历单词数组
if(stringWord.charAt(j)>='A' && stringWord.charAt(j)<='Z'){
stringWord=stringWord.replace(j,j+1,
String.valueOf((char) (stringWord.charAt(j) + 32)));
}else if(stringWord.charAt(j)>='a' && stringWord.charAt(j)<='z'){
stringWord =stringWord.replace(j,j+1,
String.valueOf((char) (stringWord.charAt(j)-32)));
}else{
stringWord =stringWord.replace(j,j+1, " " );
}
}
System.out.println("大小写后的:"+stringWord);
res.append(stringWord).append(" ");
}
//去掉最后一个空格
res.deleteCharAt(n);
return res.toString();
}
}
题目二:
描述
给你一个大小为 n 的字符串数组 strs ,其中包含n个字符串 , 编写一个函数来查找字符串数组中的最长公共前缀,返回这个公共前缀。
思路:
既然是公共前缀,那我们可以用一个字符串与其他字符串进行比较,从第一个字符开始,逐位比较,找到最长公共子串。
具体做法:
step 1:处理数组为空的特殊情况。
step 2:因为最长公共前缀的长度不会超过任何一个字符串的长度,因此我们逐位就以第一个字符串为标杆,遍历第一个字符串的所有位置,取出字符。
step 3:遍历数组中后续字符串,依次比较其他字符串中相应位置是否为刚刚取出的字符,如果是,循环继续,继续查找,如果不是或者长度不足,说明从第i位开始不同,前面的都是公共前缀。
step 4:如果遍历结束都相同,最长公共前缀最多为第一个字符串。
图示:
package com.company.day02;
import java.util.*;
public class Solution {
/**
*
* @param strs string字符串一维数组
* @return string字符串
*/
public String longestCommonPrefix (String[] strs) {
// write code here
//第一步:处理空数组,返回空串,竖排数组
int n = strs.length;
if(n == 0)
return "";
//第二步:遍历第一个字符串的所有位置,取出字符
//i代表第一个数组的下标,移动的方向是横向右移
for (int i = 0; i < strs[0].length(); i++) {
//j代表的数组的容量长度,j移动的方向是向下纵向移动
for (int j = 1; j < n; j++) {
//必须先判断长度不足的,然后判断字符不等的
//条件1:数组中第二个字符串长度刚好等于i 下标,,则证明第二个字符串结束了
//条件2: 数组中第二个字符串 i 位置的字符和标杆字符串i位置字符不相等
if(strs[j].length()==i ||
strs[0].charAt(i)!= strs[j].charAt(i) )
return strs[0].substring(0,i);//返回到i的截取字符串
}
}
//比较完毕
return strs[0];
}
public static void main(String[] args) {
//["abca","abc","abca","abc","abcc"]
Solution solution = new Solution();
String[] strings = new String[]{"abca","abc","abca","abc","abcc"};
String s = solution.longestCommonPrefix(strings);
System.out.println(s);
}
}
方法二:
import java.util.*;
public class Solution {
//找出两个字符串的最长公共前缀
public String twoLLongestCommonPrefix (String str1,String str2){
//找出短的字符串长度
int length=str1.length()>str2.length()?str2.length():str1.length();
StringBuilder sb=new StringBuilder();
for(int i=0;i<length;i++){ //相同的提取出来,遇到不同的直接结束循环
if(str1.charAt(i)==str2.charAt(i)){
sb.append(str1.charAt(i));
}else{
break;
}
}
String str=sb.toString();
return str;
}
public String longestCommonPrefix (String[] strs) {
if(strs.length==0){
return "";
}
for(int i=0;i<strs.length-1;i++){
//找出两个字符串的最长公共前缀
String str=twoLLongestCommonPrefix(strs[i],strs[i+1]);
strs[i+1]=str; //用找出的字符串再与下一个字符串找
}
return strs[strs.length-1];
}
}