力扣_字符串
反转字符串
// 使用双指针法,初始状态是一个在最左边一个在最右边。
// 然后最左最右交换元素,直至左右指针相遇
class Solution {
public void reverseString(char[] s) {
//求s的数组长度
int n = s.length;
//设计左右指针
int l = 0;
int r = n-1;
//开始交换
for(;l < r;l++,r--){
char temp = s[l];
s[l] = s[r];
s[r] = temp;
}
}
}
整数反转
//设置一个变量rev用于存入交换的数字
//每次将传入参数除余10得到最后一位元素end
//然后将变量rev乘以10,加上最后一位元素end
//循环直到传入参数为0
//因为要将rev乘以10,所以要判断要不要是不是出界
class Solution {
public int reverse(int x) {
int rev = 0;
while (x != 0) {
if (rev < Integer.MIN_VALUE / 10 || rev > Integer.MAX_VALUE / 10) {
return 0;
}
int digit = x % 10;
x /= 10;
rev = rev * 10 + digit;
}
return rev;
}
}
字符串中的第一个唯一字符
//设置一个数组,长度为26,用来保存字符串s中a~z出现的次数
//第一次循环字符串是用来保存字符串中a~z中出现的次数
//第二次循环是寻找字符串中第一个出现次数为1的位置
class Solution {
public int firstUniqChar(String s) {
//设置数组t
int[] t = new int[26];
//求数组s的长度
int n = s.length();
//第一次循环
for(int i = 0;i < n;i++){
t[s.charAt(i) - 'a']++;
}
for(int i = 0;i < n;i++){
if(t[s.charAt(i) - 'a'] == 1){
return i;
}
}
return -1;
}
}
有效的字母异位词
//设置两个数组a1和a2用来分别保存字符串s和t穿线字母的个数
//循环判断a1和a2中字母的个数是否相同
class Solution {
public boolean isAnagram(String s, String t) {
//设置数组
int[] a1 = new int[26];
int[] a2 = new int[26];
//保存字符串s和t的长度
int n1 = s.length();
int n2 = t.length();
//如何两者长度不一样直接出错
if(n1 != n2){
return false;
}
//循环保存字符串s和t中字母出现的个数
for(int i = 0;i < n1;i++){
a1[s.charAt(i) - 'a']++;
}
for(int i = 0;i < n2;i++){
a2[t.charAt(i) - 'a']++;
}
//循环判断字符串s和t中字母出现的个数是否相同
for(int i = 0; i < 26;i++){
if(a1[i] != a2[i]){
return false;
}
}
return true;
}
}
验证回文串
//将传入字符串中的数字和字母保存到新字符串中,并且将传入字符串的大写字母变成小写字母
//判断是否为回文串
class Solution {
public boolean isPalindrome(String s1) {
//传入字符的长度
int n = s1.length();
//设置新字符串
StringBuffer sb = new StringBuffer();
//保存传入字符串中的字母和数字
for(int i = 0; i < n;i++){
//暂存传入字符串中的字母
char ch = s1.charAt(i);
//判断传入字母是否为数字和字母
if(Character.isLetterOrDigit(ch)){
sb.append(Character.toLowerCase(ch));
}
}
//求新字符串的长度
int n2 = sb.length();
//设置新字符串用于保存上一字符串的倒置
StringBuffer sb2 = new StringBuffer(sb).reverse();
//判断字符串是否为回文串
for(int i = 0;i < n2;i++){
if(sb.charAt(i) != sb2.charAt(i)){
return false;
}
}
return true;
}
}
字符串转换整数 (atoi)
//去除字符串中的空格字符
//如果字符串的长度为0,则返回0
//如果字符串的第一个字符不是数字也不是加减号,则返回0
//如果第一个字符是正号,则保存后续数字
//如果第一个字符是负号,则保存后续数字
//如果第一个字符是数字,则保存这个数字以及后续数字
class Solution {
public int myAtoi(String s) {
if (s.length() == 0) {
return 0;
}
int res = 0;
int i = 0, sign;
while (s.charAt(i) == ' ') {
if (++i >= s.length()) {
return 0;
}
}
if (s.charAt(i) == '+' || Character.isDigit(s.charAt(i))) {
sign = 1;
if (s.charAt(i) == '+') {
i++;
}
} else if (s.charAt(i) == '-') {
sign = -1;
i++;
} else {
return 0;
}
while (i < s.length() && Character.isDigit(s.charAt(i))) {
int num = s.charAt(i) - 48;
if ((sign == 1) && (res > (Integer.MAX_VALUE - sign * num) / 10)) {
return Integer.MAX_VALUE;
} else if ((sign == -1) && (res < (Integer.MIN_VALUE - sign * num) / 10)) {
return Integer.MIN_VALUE;
}
res = 10 * res + sign * num;
i++;
}
return res;
}
}
实现 strStr()
//求字符串和子串的长度,若字符串和子串的长度都为0,则返回0
//若字符串的长度小于子串的长度,则返回-1
//暴力法判断子串是否存在于字符串中,若存在则返回起始值,若不存在则返回-1
class Solution {
public int strStr(String haystack, String needle) {
//求字符串和子串的长度
int n1 = haystack.length();
int n2 = needle.length();
//字符串和子串的长度都为0
if(n1 == 0 && n2 == 0){
return 0;
}
//判断字符串的长度是否大于子串的长度
if(n1 < n2){
return -1;
}
//判断子串是否在字符串中出现
for(int i = 0;i + n2 <= n1;i++){
int j = 0;
for(;j < n2;j++){
if(haystack.charAt(i+j) != needle.charAt(j)){
break;
}
}
if(j == n2){
return i;
}
}
return -1;
}
}
外观数列
//重点就是求出同一数字出现几次
class Solution {
public String countAndSay(int n) {
//输入:n = 1 输出:"1"
String ret = "1";
for(int i = 2;i <= n;i++){
StringBuffer sb = new StringBuffer();
int start = 0;
int post = 0;
//求出同一数字出现几次,并存入到sb
while(post < ret.length()){
while(post < ret.length() && ret.charAt(post) == ret.charAt(start)){
post++;
}
sb.append(Integer.toString(post-start)).append(ret.charAt(start));
start = post;
}
ret = sb.toString();
}
return ret;
}
}
最长公共前缀
//先求strs[0]与strs[1]的最长前缀
//在用求得的最长前缀与strs[2]求它俩的最长前缀
//循环下去
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0 || strs == null){
return "";
}
//求数组长度
int n = strs.length;
//假设最长前缀为strs[0]
String prefix = strs[0];
//循环取最长前缀
for(int i = 1;i < n;i++){
prefix = Prefix(prefix,strs[i]);
}
return prefix;
}
//求最长前缀
public String Prefix(String str1,String str2){
//求str1和str2的长度
int n1 = str1.length();
int n2 = str2.length();
int n = 0;
if(n1 < n2){
n = n1;
}else{
n = n2;
}
int temp = 0;
for(int i = 0;i < n;i++){
if(str1.charAt(i) == str2.charAt(i)){
temp++;
}else{
break;
}
}
return str1.substring(0,temp);
}
}

浙公网安备 33010602011771号