赞
踩
这两个方法非常非常重要
外加charAt()方法
0-9 48-57
A-Z 65-90
a-z 97-122
需要记住的是0-9是最小的,然后A-Z是处在中间的,a-z是最大的,也就是“0大小”
具体ascii值为多少你可以不用记,记住0的ascii码值为48即可
其他字符的ascii码可以通过这种方式求出来
- char ch='A';
-
- int num=ch-'0';
-
- System.out.println(num);//17 ‘0’的ascii码是48,所以A的ascii码就是65
1.如何定义一个字符串:
下面两种方法都可以:
- String string=new String("HelloWorld");
- String string="HelloWorld";
2.string.charAt(i)取出字符串中某个字符
- String string="HelloWorld";
- System.out.println(string.charAt(4));
- //得到o
3.字符数组和字符串的相互转换
(1)字符数组转字符串
- char[] array=new char[5];
- array[0]='g';
- array[1]='o';
- array[2]='o';
- array[3]='d';
- array[4]='!';
- String result=new String(array,0,array.length);//显然这里是左闭右开[0,array.length)
- System.out.println(result);
- //输出:good!
- 或者直接String result=new String(array)
(2)字符串转字符数组(非常非常重要,因为数组我们非常非常熟)
- String s="abcdefghijk"
-
- char[] result=s.toCharArray();
4.StringBuilder转字符串String
StringBuildr.toString();
注意:StringBuilder有reverse方法,反转字符串,String没有这个反转方法
5.字符串转化为字符数组
char[] array=string.toCharArray();
6.字符串截取子串string.substring() :前闭后开
- String s=“Hello,World!”;
- String s2=s.substring(1,5)
- //"ello,"
7.判断两个字符串是否相等
s1.equals(s2)
判断两个字符串的值是否相等,而不是判断地址是否相等
8.split分割方法:最后得到的是一个字符串数组,也就是数组中每一个元素都是字符串
下面的例子就是以空格为分割符切分字符串
9. startswith方法和endswith方法:
startsWith()方法和endsWith()方法,可以判断某字符串是否以指定字符串开始或结束
10.字符串按字典序排序
本意是按照英文单词在字典中的先后顺序进行排列,但是字符串不仅仅是英文字母,还包括数字,特殊字符等,于是引申为字符串大小比较:
- System.out.println("ah1x".compareTo("ahb"));
- //会输出 -49−49,这个数是两个字符串第一个不一样的位置的两个字符的 ASCII 值之差,如果小于零则说明第一个字符串小于第二个字符串。
- public class LuckyDog
- {
- public static void main(String[] args)
- {
- String[] words = {"Ruby", "C", "Python", "Java"};
- for (int i = 0; i < words.length - 1; i++) {
- for (int j = i + 1; j < words.length; j++) {
- //如果前面的字符比后面的字符大,交换相邻两个字符串
- if (words[i].compareTo(words[j]) > 0) {
- // words[i] 与 words[j] 交换
- String temp = words[i];
- words[i] = words[j];
- words[j] = temp;
- }
- }
- }
- System.out.println("按照字典顺序:");
- for (int i = 0; i < words.length; i++)
- {
- System.out.println(words[i]);
- //C,Java,Python,Ruby
- }
- }
- }

或者是:
- public class LuckyDog
- {
- public static void main(String[] args)
- {
- String[] words = {"Ruby", "C", "Python", "Java"};
- ArrayList<String> arraylist=new ArrayList();
- for (int i = 0; i < words.length ; i++)
- {
- arraylist.add(words[i]);
- }
- Collections.sort(arraylist);
- System.out.println("按照字典顺序:");
- for (int i = 0; i < arraylist.size(); i++)
- {
- System.out.println(arraylist.get(i));
- //C,Java,Python,Ruby
- }
- }
- }

11.string.replace()方法
返回的是一个新字符串,原字符串不会发生改变
注意:replace是一次性把所有的都替换掉
而且可以字符串换字符串,字符串换字符,字符换字符,字符换字符串
12.stringbuilder.deleteCharAt(i) 删除指定位置的字符
是stringbuilder的方法,直接对原stringbuilder进行改造,而不是返回一个一个新的stringbuilder
另外要注意:当字符串太长的时候,如果要分成两行写,不能直接就分成两行:
- System.out.println("I love
- Java!");
这样是无法通过编译的,而是需要用+将两个字符串连接起来
- System.out.println("I love"+
- "Java!");
刷完下面的题你会发现,将字符串转化为字符数组很常用,String和StringBuilder之间的相互转化也非常常见
13.判断字符串中是否包含某个字符:
string.contains("a");//返回true或者false
例题
(1)力扣替换空格
- class Solution
- {
- public String replaceSpace(String s)
- {
- //定义一个数组,这个数组长度是字符串长度的三倍
- //因为一个空格换成%20三个字符,所以三倍长度才能完全容纳字符串
- char[] array = new char[s.length() * 3];
- int size = 0;//size是我们定义的数组中的下标
- //用i来取出字符串中每一个字符
- for (int i = 0; i < s.length(); i++)
- {
- char c = s.charAt(i);
- if (c == ' ')
- {
- array[size] = '%';
- size++;
- array[size] = '2';
- size++;
- array[size] = '0';
- size++;
- }
- else
- {
- array[size] = c;
- size++;
- }
- }
- //注意这里不能 String result = new String(array),因为你开的数组是s.length() * 3,但是实际上你很肯可能并没有全部填满
- String result = new String(array, 0, size);
- return result;
- }
- }

有一道很相似的题目:力扣1108 IP地址无效化
- class Solution
- {
- public String defangIPaddr(String address)
- {
- String result=address.replace(".","[.]");
-
- return result;
- }
- }
- class Solution {
- public String defangIPaddr(String address) {
- StringBuilder s = new StringBuilder();
- for (int i = 0; i < address.length(); i++) {
- if (address.charAt(i) == '.') {
- //s.append('[');
- //s.append('.');
- //s.append(']');
- s.append("[.]");
- } else {
- s.append(address.charAt(i));
- }
- }
- return s.toString();
- }
- }

(2)左旋转字符串
力扣剑指offer58
k就是说把前k个字符放到字符串最后面去
比如这里k=2,就是说把前面两个字符放到字符串最后面去
方法一:利用substring方法截取字符串子串的方法,将字符串先变成两个字符串,第一个字符串str1是前k个字符组成的,第二个字符串str2是由剩下的字符组成的,然后两个字符串进行拼接,而且是str2放在前面,str1放在后面,也就是说str2+str1
- class Solution
- {
- public String reverseLeftWords(String s, int n)
- {
- //substring是前闭后开
- String s1=s.substring(0, n);
- String s2=s.substring(n, s.length());
- return s2+s1;
-
- }
- }
方法二:
- class Solution
- {
- public String reverseLeftWords(String s, int n)
- {
- StringBuilder result = new StringBuilder();
-
- //先把后面的字符添加进StringBuilder里面
- for(int i = n; i < s.length(); i++)
- {
- result.append(s.charAt(i));
- }
- //再把前面的字符添加进StringBuilder里面
- 1 for(int i = 0; i < n; i++)
- {
- result.append(s.charAt(i));
- }
- //将StringBuilder转化为String字符串
- return result.toString();
- }
- }

方法三:
-
- class Solution
- {
- public String reverseLeftWords(String s, int n)
- {
- String result = "";
- for(int i = n; i < s.length(); i++)
- {
- result += s.charAt(i);
- }
- for(int i = 0; i < n; i++)
- {
- result += s.charAt(i);
- }
- return result;
- }
- }
-

(3)实现strStr()
力扣28 :找出一个字符串在另一个字符串中出现的位置
暴力法:
- class Solution
- {
- //求出s2在s1中出现的位置
- public int strStr(String s1, String s2)
- {
- if(s2.equals(""))
- {
- return 0;
- }
- if(s1.length()<s2.length()) return -1;
- if(s1.length()==s2.length())
- {
- if(s1.equals(s2)) return 0;
- else
- {
- return -1;
- }
- }
-
- //先将两个字符串都转成字符数组
- char[] c1=s1.toCharArray();
- char[] c2=s2.toCharArray();
-
- //其实就是暴力法,对于s1中的每个字符,如果这个字符是s2的首字符,就继续比较
- //但是不是用i来比较,而是用temp来代表str1来进行比较,用j来代表str2来进行比较
- for(int i=0;i<c1.length;i++)
- {
- //一个优化,如果i走到了str1剩下的字符串长度小于str2的字符串长度
- //那说明str2不可能是str1的子串
- //c1.length-i<c2.length
- if(i>c1.length-c2.length) return -1;
- int temp=i;
- for(int j=0;j<c2.length;)
- {
- if(c2[j]==c1[temp])
- {
- temp++;
- j++;
- }
- else
- {
- break;
- }
- if(j==c2.length) return i;
- }
- }
- return -1;
- }

(4)最长公共前缀
力扣14
将第一个字符串(字符串1)作为基准,其他所有的字符串(字符串2,3,4,5)和它一起比较
- class Solution
- {
- public String longestCommonPrefix(String[] strs)
- {
- //遍历str[0]这个字符串的每一个字符
- for(int i=0;i<strs[0].length();i++)
- {
- char temp=strs[0].charAt(i);
- //和其他字符串str[1],str[2]....进行比较
- for(int j=1;j<strs.length;j++)
- {
- //如果此时i已经超出了字符串str[1],str[2]...的长度或者此时别的字符串第i个位置不等于str[0]的第i个位置那就可以停止比较了
- if(i==strs[j].length()||strs[j].charAt(i)!=temp)
- {
- return strs[0].substring(0,i);
- }
- }
- }
- return strs[0];
- }
- }

(5)力扣557 反转字符串中的单词|||
- class Solution
- {
- public String reverseWords(String s)
- {
- //得到一个字符串数组
- String[] array=s.split(" ");
-
- StringBuilder result=new StringBuilder();
-
- //遍历字符串数组里的每一个字符串
- for(int i=0;i<array.length;i++)
- {
- //遍历字符串中每一个字符,从最后一个字符遍历到第一个字符,翻转字符串
- for(int j=array[i].length()-1;j>=0;j--)
- {
- result.append(array[i].charAt(j));
- }
-
- //每翻转完一个字符串就添加一个空格
- if(i!=array.length-1)
- {
- result.append(" ");
- }
- }
- return result.toString();
- }
- }

(6)力扣541反转字符串||
- class Solution
- {
- public String reverseStr(String s, int k)
- {
- int n=s.length();
- //将字符串转化为字符数组
- //这里先将字符串转化为字符数组,最后再将字符数组转回字符串
- char[] result=s.toCharArray();
-
- //太优秀了:i每次的取值是0,2k,4k,6k......
- //也就是说跳跃间距不是i++的1,而是2k
- for(int i=0;i<s.length();i=i+2*k)
- {
- //每次反转的起点就是i,终点就是i+k-1,一共k个数
- //也有可能是起点是i,终点是n-1(最后一轮字符数小于k)
- //所以最后终点是Math.min(i+k-1,n-1)
- reverse(result,i,Math.min(i+k,n)-1);
- }
- return new String(result);
- }
- public void reverse(char[] result,int left,int right)
- {
- while(left<right)
- {
- char temp=result[left];
- result[left]=result[right];
- result[right]=temp;
- left++;
- right--;
- }
- }
- }

- class Solution
- {
- public char firstUniqChar(String s)
- {
- HashMap<Character,Integer> map=new HashMap();
-
-
- for(int i=0;i<s.length();i++)
- {
- char temp=s.charAt(i);
- map.put(temp,map.getOrDefault(temp,0)+1);
- }
- for(int i=0;i<s.length();i++)
- {
- char temp=s.charAt(i);
- if(map.get(temp)==1) return temp;
- }
- return ' ';
- }
- }

(8)力扣165 比较版本号
- class Solution
- {
- public int compareVersion(String version1, String version2)
- {
- //比较两个版本号的大小
- //1.0版本小于1.1
-
- //以.作为分隔符的时候,需要加上转义气分割符\\
- String[] string1=version1.split("\\.");
- String[] string2=version2.split("\\.");
- //分割后是一个字符数组,数组中每一个元素是字符串(不是单个字符)
- //比如:版本号本身为:1.001.01,split后:[“1”,"001","01"]
-
- int n1=string1.length;
- int n2=string2.length;
- int i=0,j=0;
- while(i<n1||j<n2)
- {
- int num1=0,num2=0;
- if(i<n1)
- {
- //001和01是相等的,Integer.parseInt()转成整数的时候会帮你去掉前导0
- num1=Integer.parseInt(string1[i]);
- i++;
- }
- if(j<n2)
- {
- num2=Integer.parseInt(string2[j]);
- j++;
- }
- if(num1!=num2)
- {
- if(num1>num2)
- {
- return 1;
- }
- else
- {
- return -1;
- }
- }
- }
- return 0;
- }
- }

(9)力扣字符串相加
- class Solution
- {
- public String addStrings(String string1, String string2)
- {
- //4 5 6
- // 7 7
- //5 3 3
- //从字符串最后一位加到第一位,所以i,j初始值是string1.length( ) - 1,string2.length( ) - 1;
- int i =string1.length( ) - 1;
- int j =string2.length( ) - 1;
-
- int flag = 0;
-
- StringBuilder result = new StringBuilder( );
-
- while (i >= 0 || j >= 0)
- {
-
- int num1=0,num2=0,sum=0;
- if (i >= 0)
- {
- num1 = string1.charAt( i ) - '0';
- }
- if (j >= 0)
- {
- num2= string2.charAt(j) - '0';
- }
- sum= num1 + num2 + flag;
-
- flag=sum/10;
- sum=sum%10;
-
- result.append( sum % 10 );
- i--;
- j--;
- }
- if (flag == 1)
- {
- result.append( 1 );
- }
- return result.reverse( ).toString( ) ; // write code here
- }
- }

(10)力扣LCP17 速算机器人
- class Solution
- {
- public int calculate(String s)
- {
- int x=1,y=0;
- for(int i=0;i<s.length();i++)
- {
- if(s.charAt(i)=='A')
- {
- x = 2 * x + y;
- }
- if(s.charAt(i)=='B')
- {
- y = 2 * y + x;
- }
- }
- return x+y;
- }
- }

(11)力扣798 旋转字符串
判断a字符串经过旋转能否变成b字符串
只需要判断b字符串是否是a+a的子串即可
- class Solution {
- public boolean rotateString(String a, String b)
- {
- if(a.length()!=b.length()) return false;
- return (a+a).contains(b);
- }
- }
(12)力扣434 字符串中的单词数
对于split函数而言, \\s表示 空格,回车,换行等空白符, +号表示一个或多个的意思
如果下面的代码:
- class Solution
- {
- public int countSegments(String s)
- {
- if(s.length()==0) return 0;
-
- //通过空格进行分割
- String words[]=s.split("\\s+");//\\s表示空格.\\s+表示可能有多个字符
-
- int length=words.length;
-
- return length;
- }
- }
这个测试用例过不了,这是因为这个用例是以空格开头,这样分割出来的字符数组第一个元素是空,所以还有判断一下字符数组中每一个元素是否为空
- class Solution
- {
- public int countSegments(String s)
- {
- if(s.length()==0) return 0;
-
- //通过空格进行分割
- String words[]=s.split("\\s+");//\\s表示空格.\\s+表示可能有多个字符
-
- int length=words.length;
-
- int result=0;
-
- //还要判断一下分割出来的字符数组中的元素是不是为空
- for(int i=0;i<length;i++)
- {
- if(words[i].length()>0) result++;
- }
- return result;
- }
- }

(13)力扣 查找searchWord是否是字符串sentence中某个单词的前缀
- class Solution
- {
- public int isPrefixOfWord(String sentence, String searchWord)
- {
- //查找searchWord是否是sentence中某个单词的前缀
- String[] words=sentence.split("\\s");
-
- //遍历字符串数组中每一个字符串
- for(int i=0;i<words.length;i++)
- {
- String temp=words[i];
-
- //遍历待查找字符串中的每一个字符
- for(int j=0;j<searchWord.length();j++)
- {
- if(j>=temp.length())
- {
- break;
- }
- else
- {
- if(searchWord.charAt(j)==temp.charAt(j))//相等就比较下一个字符
- {
- if(j==searchWord.length()-1)
- {
- return i+1;
- }
- else
- {
- continue;
- }
- }
- else//不相等就直接比较下一个单词
- {
- break;
- }
- }
-
- }
- }
- return -1;
- }
- }

字符串最后一个单词的长度
- import java.util.Scanner;
- public class Main
- {
- public static void main(String[] args)
- {
- Scanner scanner=new Scanner(System.in);
- String input=scanner.nextLine();
-
- int result=0;
-
- int i=input.length()-1;
-
- while(i>=0&&input.charAt(i)!=' ')//从后往前遍历字符串中的每一个字符,直到遇到空格
- {
- result++;
- i--;
- }
-
- System.out.println(result);
- }
- }

十六进制转十进制
- public class Main {
- public static void main(String[] args) {
- Scanner in = new Scanner(System.in);
- String input=in.next();
-
- int result=0;
-
- for(int i=0;i<input.length();)
- {
- char temp=input.charAt(i);
- if(temp>='0'&&temp<='9')
- {
- result=result*16+(temp-'0');
- i++;
- }
- else if(temp>='A'&&temp<='F')
- {
- result=result*16+(temp-'A'+10);
- i++;
- }
- else
- {
- i++;
- }
- }
- System.out.println(result);
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。