【LeetCode】初級演算法:字串
題目可以在LeetCode檢視
1. 反轉字串
用時:3ms
class Solution {
public String reverseString(String s) {
// 用時:4ms
// StringBuilder sb=new StringBuilder();
// for(int i=s.length()-1;i>=0;--i){
// sb.append(s.charAt(i));
// }
// return sb.toString();
return new StringBuilder(s).reverse().toString();
}
}
2. 顛倒整數
用時:31ms
class Solution {
public int reverse(int x) {
boolean negative = x < 0;
if (negative){
x = -x;
}
long r = 0;
while (x>0) {
r = r * 10 + x % 10;
x /= 10;
}
if (negative){
r = -r;
}
if (r > Integer.MAX_VALUE || r < Integer.MIN_VALUE){
return 0;
}
return (int)r;
}
}
3. 字串中的第一個唯一字元
用時:43ms
class Solution {
public int firstUniqChar(String s) {
int len=s.length();
HashSet<Character> repeat=new HashSet<>();
Character temp;
boolean find=false;
// 一個一個比較如果不重複則找到
for(int i=0;i<len;++i){
temp=s.charAt(i);
if(!repeat.contains(temp)){
find=true;
for(int j=i+1;j<len;++j){
if(temp.equals(s.charAt(j))){
find=false;
break;
}
}
}
if(find){
return i;
}else{
repeat.add(temp);
}
}
return -1;
}
}
4. 有效的字母異位詞
用時:9ms
class Solution {
public boolean isAnagram(String s, String t) {
int len=s.length();
if(len!=t.length()){
return false;
}
// s有某字母則加1,t有則減一,最終都為0
int[] words=new int[26];
for(int i=0;i<len;++i){
++words[s.charAt(i)-97];
--words[t.charAt(i)-97];
}
for(int i:words){
if(i!=0){
return false;
}
}
return true;
}
}
5. 驗證迴文字串
用時:31ms
class Solution {
public boolean isPalindrome(String s) {
// 只留下字母和數字
s=s.replaceAll("[^a-zA-Z0-9]","");
// 忽略大小寫比較
StringBuilder reverse=new StringBuilder(s).reverse();
if(s.equalsIgnoreCase(reverse.toString())){
return true;
}
return false;
}
}
6. 字串轉整數(atoi)
用時:30ms
class Solution {
public int myAtoi(String str) {
int len=str.length();
// 找到第一個非空格
int i=0;
while(i<len&&str.charAt(i)==' '){
++i;
}
// 如果i溢位則為空串或空格
if(i==len){
return 0;
}
// 判斷第一個字元是正負號、非數字
char temp=str.charAt(i);
boolean neg=false;
if(temp=='-'||temp=='+'){
neg=(temp=='-'?true:neg);
++i;
}else if(temp<48&&temp>57){
return 0;
}
// 正負號是末尾字元
if(i==len){
return 0;
}
// 將數字提取出來
StringBuilder numStr=new StringBuilder();
temp=str.charAt(i);
while(temp>=48&&temp<=57){
numStr.append(temp);
if(++i>=len){
break;
}
temp=str.charAt(i);
}
// 去除前面的0
while(numStr.length()!=0&&numStr.charAt(0)=='0'){
numStr.deleteCharAt(0);
}
// 如果為空串
if(numStr.length()==0){
return 0;
}
// 如果長度太長則直接返回最值
if(numStr.length()>=11){
if(neg){
return Integer.MIN_VALUE;
}
return Integer.MAX_VALUE;
}
// 轉為long
Long num=Long.valueOf(numStr.toString());
if(neg){
num=-num;
}
if(num<Integer.MIN_VALUE){
return Integer.MIN_VALUE;
}else if(num>Integer.MAX_VALUE){
return Integer.MAX_VALUE;
}
return num.intValue();
}
}
7. 實現strStr()
用時:5ms
class Solution {
public int strStr(String haystack, String needle) {
int len1=haystack.length(),len2=needle.length();
if(len2==0){
return 0;
}
int i=0;
char first=needle.charAt(0);
// 直接比較子串
while(i<=(len1-len2)){
if(needle.equals(haystack.substring(i,len2+i))){
return i;
}
++i;
}
return -1;
}
}
8. 數數並說
用時:5ms
class Solution {
// 儲存上一次的序列和n,用於直接從這一次開始
public static StringBuilder startsb=new StringBuilder("1");
public static int startn=1;
public String countAndSay(int n) {
StringBuilder presb=new StringBuilder("1");
StringBuilder cursb=new StringBuilder();
int i=0;
// 如果n大於上一次的n,則可以直接從上一次開始
if(n>=startn){
presb.replace(0,presb.length(),startsb.toString());
i=startn-1;
}
// 統計字元及其個數
int count;
char num;
while(i<n-1){
for(int m=0;m<presb.length();m+=count){
num=presb.charAt(m);
count=1;
for(int j=m+1;j<presb.length();++j){
if(num==presb.charAt(j)){
++count;
}else{
break;
}
}
cursb.append(String.valueOf(count));
cursb.append(num);
}
presb.replace(0,presb.length(),cursb.toString());
cursb.delete(0,cursb.length());
++i;
}
if(n>startn){
startsb.replace(0,startsb.length(),presb.toString());
startn=n;
}
return presb.toString();
}
}
9. 最長公共字首
用時:9ms
class Solution {
public String longestCommonPrefix(String[] strs) {
int len1=strs.length;
if(len1==0){
return "";
}
int len2=strs[0].length();
int count=0;
char temp;
boolean find;
for(int i=0;i<len2;++i){
temp=strs[0].charAt(i);
find=true;
for(int j=1;j<len1;++j){
try{
if(temp!=strs[j].charAt(i)){
find=false;
break;
}
}catch(Exception e){
find=false;
break;
}
}
if(!find){
break;
}
++count;
}
return strs[0].substring(0,count);
}
}
相關文章
- LeetCode初級-反轉字串LeetCode字串
- 【LeetCode】初級演算法:樹LeetCode演算法
- LeetCode初級演算法之字串:242 有效的字母異位詞LeetCode演算法字串
- 【LeetCode】初級演算法:陣列LeetCode演算法陣列
- 【Leetcode】初級演算法-數學LeetCode演算法
- 【LeetCode】初級演算法:連結串列LeetCode演算法
- LeetCode初級演算法之字串:387 字串中的第一個唯一字元LeetCode演算法字串字元
- 【LeetCode】初級演算法:排序和搜尋LeetCode演算法排序
- c++ LeetCode (初級字串篇) 九道演算法例題程式碼詳解(二)C++LeetCode字串演算法
- [leetcode初級演算法]動態規劃總結LeetCode演算法動態規劃
- 初級演算法演算法
- 初級演算法-樹演算法
- [Golang]力扣Leetcode—初級演算法—樹—二叉樹的最大深度Golang力扣LeetCode演算法二叉樹
- 初級演算法-連結串列演算法
- 素數判定演算法 初級演算法
- 『演算法』之 初級排序演算法總結演算法排序
- 初級演算法-動態規劃演算法動態規劃
- leetcode:字串相乘(java)LeetCode字串Java
- Kotlin——初級篇(八):關於字串(String)常用操作彙總Kotlin字串
- LeetCode 394 字串解碼LeetCode字串
- LeetCode-415-字串相加LeetCode字串
- LeetCode-043-字串相乘LeetCode字串
- leetcode 87 擾亂字串LeetCode字串
- Python入門第5課——字串變數初級(只讀課堂)Python字串變數
- LeetCode 567. 字串的排列LeetCode字串
- [Leetcode]394.字串解碼LeetCode字串
- 【LeetCode】796. 旋轉字串LeetCode字串
- LeetCode-344-反轉字串LeetCode字串
- LeetCode-097-交錯字串LeetCode字串
- LeetCode 205. 同構字串LeetCode字串
- LeetCode-824. Goat Latin(字串分割)LeetCodeGo字串
- 【ALGO】Leetcode 97.交錯字串GoLeetCode字串
- LINUX初級命令Linux
- 初級掃雷
- 初學者Mybatis的初級使用MyBatis
- 字串演算法字串演算法
- LeetCode演算法題LeetCode演算法
- leetcode 1525 字串的好分割數目(雜湊表,字串分割)LeetCode字串