目录
目录
13.罗马数字转整数
344.反转字符串
28.实现strStr()
125.验证回文串
14.最长公共前缀
551.学生出勤记录I
657.机器人能否返回原点
20.有效的括号
67.二进制求和
1071.字符串的最大公因子
58.最后一个单词的长度
415.字符串相加
696.计数二进制字串
520.检测大写字母
面试题01.06.字符串压缩
409.最长回文串
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。示例 1:
输入: "III"
输出: 3
示例 2:输入: "IV"
输出: 4
示例 3:输入: "IX"
输出: 9
示例 4:输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/roman-to-integer
class Solution {
public int romanToInt(String s) {
int sum=0;
int num=0;
int numAfter=0;
for(int i=s.length()-1;i>=0;i--){
if(s.charAt(i)=='I'){
num=1;
}else if(s.charAt(i)=='V'){
num=5;
}else if(s.charAt(i)=='X'){
num=10;
}else if(s.charAt(i)=='L'){
num=50;
}else if(s.charAt(i)=='C'){
num=100;
}else if(s.charAt(i)=='D'){
num=500;
}else if(s.charAt(i)=='M'){
num=1000;
}
if(numAfter>num){
sum-=num;
}else{
sum+=num;
}
numAfter=num;
}
return sum;
}
}
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例 1:
输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]
示例 2:输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-string
class Solution {
public void reverseString(char[] s) {
char a=' ';
for(int i=0;i
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1:
输入: haystack = "hello", needle = "ll"
输出: 2
示例 2:输入: haystack = "aaaaa", needle = "bba"
输出: -1
说明:当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/implement-strstr
class Solution {
public int strStr(String haystack, String needle) {
boolean flag=false;
int index=0;
if(needle.length()==0){
return 0;
}
for(int i=0;i<=haystack.length()-needle.length();){
index=i;
for(int j=0;j
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:输入: "race a car"
输出: false来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-palindrome
class Solution {
public boolean isPalindrome(String s) {
boolean flag=true;
int i=0;
int j=s.length()-1;
char word1=' ';
char word2=' ';
while(i='A'&&s.charAt(i)<='Z'){
word1=(char)((int)s.charAt(i)+32);
}else if(s.charAt(i)>='a'&&s.charAt(i)<='z'){
word1=s.charAt(i);
}else if(s.charAt(i)>='0'&&s.charAt(i)<='9'){
word1=s.charAt(i);
}else{
i++;
continue;
}
if(s.charAt(j)>='A'&&s.charAt(j)<='Z'){
word2=(char)((int)s.charAt(j)+32);
}else if(s.charAt(j)>='a'&&s.charAt(j)<='z'){
word2=s.charAt(j);
}else if(s.charAt(j)>='0'&&s.charAt(j)<='9'){
word2=s.charAt(j);
}else{
j--;
continue;
}
i++;
j--;
if(word1!=word2){
flag=false;
break;
}
}
return flag;
}
}
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:所有输入只包含小写字母 a-z 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-common-prefix
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length==0){
return "";
}
int minLen=strs[0].length();
for(int i=0;i
给定一个字符串来代表一个学生的出勤记录,这个记录仅包含以下三个字符:
'A' : Absent,缺勤
'L' : Late,迟到
'P' : Present,到场
如果一个学生的出勤记录中不超过一个'A'(缺勤)并且不超过两个连续的'L'(迟到),那么这个学生会被奖赏。你需要根据这个学生的出勤记录判断他是否会被奖赏。
示例 1:
输入: "PPALLP"
输出: True
示例 2:输入: "PPALLL"
输出: False来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/student-attendance-record-i
class Solution {
public boolean checkRecord(String s) {
int count_A=0;
int count_L=0;
boolean flag=true;
for(int i=0;i
在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束。
移动顺序由字符串表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有 R(右),L(左),U(上)和 D(下)。如果机器人在完成所有动作后返回原点,则返回 true。否则,返回 false。
注意:机器人“面朝”的方向无关紧要。 “R” 将始终使机器人向右移动一次,“L” 将始终向左移动等。此外,假设每次移动机器人的移动幅度相同。
示例 1:
输入: "UD"
输出: true
解释:机器人向上移动一次,然后向下移动一次。所有动作都具有相同的幅度,因此它最终回到它开始的原点。因此,我们返回 true。
示例 2:输入: "LL"
输出: false
解释:机器人向左移动两次。它最终位于原点的左侧,距原点有两次 “移动” 的距离。我们返回 false,因为它在移动结束时没有返回原点。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/robot-return-to-origin
class Solution {
public boolean judgeCircle(String moves) {
int x=0;
int y=0;
for(int i=0;i
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。示例 1:
输入: "()"
输出: true来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
class Solution {
public boolean isValid(String s) {
char[] chars=new char[s.length()];
int top=-1;
for(int i=0;i
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:输入: a = "1010", b = "1011"
输出: "10101"来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-binary
class Solution {
public String addBinary(String a, String b) {
int jinwe=0;
String num="";
int num1=0;
int num2=0;
String Num="";
for(int k=1;k<=Math.abs(a.length()-b.length());k++){
Num+='0';
}
if(a.length()>b.length()){
Num+=b;
b=Num;
}else{
Num+=a;
a=Num;
}
for(int i=a.length()-1;i>=0;i--){
if(a.charAt(i)=='0'){
num1=0;
}else{
num1=1;
}
if(b.charAt(i)=='0'){
num2=0;
}else{
num2=1;
}
switch(num1+num2+jinwe){
case 0:
num+='0';
break;
case 1:
num+='1';
if(jinwe==1){
jinwe=0;
}
break;
case 2:
num+='0';
if(i==0){
num+='1';
}
jinwe=1;
break;
case 3:
num+='1';
if(i==0){
num+='1';
}
jinwe=1;
break;
}
}
String ans="";
for(int z=num.length()-1;z>=0;z--){
ans+=num.charAt(z);
}
return ans;
}
}
对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。
返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。
示例 1:
输入:str1 = "ABCABC", str2 = "ABC"
输出:"ABC"
示例 2:输入:str1 = "ABABAB", str2 = "ABAB"
输出:"AB"
示例 3:输入:str1 = "LEET", str2 = "CODE"
输出:""
提示:
1 <= str1.length <= 1000
1 <= str2.length <= 1000
str1[i] 和 str2[i] 为大写英文字母来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/greatest-common-divisor-of-strings
class Solution {
public String gcdOfStrings(String str1, String str2){
String maxStr="";
String minStr="";
if(str1.length()>=str2.length()){
maxStr=str1;
minStr=str2;
}else{
maxStr=str2;
minStr=str1;
}
int i=1;
String ansStr="";
boolean flag=true;
while(true){
flag=true;
ansStr=minStr.substring(0,minStr.length()/i);
for(int j=0;j+minStr.length()/i<=minStr.length();){
if(!ansStr.equals(minStr.substring(j,j+minStr.length()/i))){
flag=false;
break;
}else{
j+=minStr.length()/i;
}
}
for(int j=0;j+minStr.length()/i<=maxStr.length();){
if(!ansStr.equals(maxStr.substring(j,j+minStr.length()/i))){
flag=false;
break;
}else{
j+=minStr.length()/i;
}
}
if(maxStr.length()%(minStr.length()/i)!=0){
flag=false;
}
if(flag|minStr.length()/i==1){
break;
}
i++;
}
if(flag){
return ansStr;
}else{
return "";
}
}
}
给定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。
如果不存在最后一个单词,请返回 0 。
说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。
示例:
输入: "Hello World"
输出: 5来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/length-of-last-word
class Solution {
public int lengthOfLastWord(String s) {
int i=s.length()-1;
if(i==-1){
return 0;
}
int count=0;
while(true){
if(s.charAt(i)!=' '){
count++;
}
i--;
if(i==-1){
break;
}
if(count!=0){
if(s.charAt(i)==' '){
break;
}
}
}
return count;
}
}
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注意:
num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-strings
class Solution {
public String addStrings(String num1, String num2) {
int n1=0;
int n2=0;
int jinwei=0;
String num="";
String n0="";
for(int i=1;i<=Math.abs(num1.length()-num2.length());i++){
n0+='0';
}
if(num1.length()>=num2.length()){
n0+=num2;
num2=n0;
}else{
n0+=num1;
num1=n0;
}
for(int i=num1.length()-1;i>=0;i--){
n1=(int)num1.charAt(i)-48;
n2=(int)num2.charAt(i)-48;
if(n1+n2+jinwei<10){
num+=(char)(n1+n2+jinwei+48);
jinwei=0;
}else{
num+=(char)((n1+n2+jinwei)%10+48);
jinwei=1;
if(i==0){
num+='1';
}
}
}
String ans="";
for(int i=num.length()-1;i>=0;i--){
ans+=num.charAt(i);
}
return ans;
}
}
给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。
重复出现的子串要计算它们出现的次数。
示例 1 :
输入: "00110011"
输出: 6
解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。请注意,一些重复出现的子串要计算它们出现的次数。
另外,“00110011”不是有效的子串,因为所有的0(和1)没有组合在一起。
示例 2 :输入: "10101"
输出: 4
解释: 有4个子串:“10”,“01”,“10”,“01”,它们具有相同数量的连续1和0。
注意:s.length 在1到50,000之间。
s 只包含“0”或“1”字符。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-binary-substrings
class Solution {
public int countBinarySubstrings(String s) {
int ans=0;
int count_now=0;
int count_new=0;
int i=0;
int j=0;
while(true){
if(i>s.length()-1){
break;
}
if(s.charAt(i)==s.charAt(j)){
count_new++;
i++;
}else{
ans+=Math.min(count_new,count_now);
count_now=count_new;
count_new=0;
j=i;
}
if(i-1==s.length()-1){
ans+=Math.min(count_new,count_now);
}
}
return ans;
}
}
给定一个单词,你需要判断单词的大写使用是否正确。
我们定义,在以下情况时,单词的大写用法是正确的:
全部字母都是大写,比如"USA"。
单词中所有字母都不是大写,比如"leetcode"。
如果单词不只含有一个字母,只有首字母大写, 比如 "Google"。
否则,我们定义这个单词没有正确使用大写字母。示例 1:
输入: "USA"
输出: True
示例 2:输入: "FlaG"
输出: False
注意: 输入是由大写和小写拉丁字母组成的非空单词。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/detect-capital
class Solution {
public boolean detectCapitalUse(String word) {
boolean flag=true;
for(int i=0;i='A'&&word.charAt(i)<='Z')){
flag=false;
}
}
if(flag){
return true;
}
flag=true;
for(int i=0;i='a'&&word.charAt(i)<='z')){
flag=false;
}
}
if(flag){
return true;
}
flag=true;
if(!(word.charAt(0)>='A'&&word.charAt(0)<='Z')){
flag=false;
}
for(int i=1;i='a'&&word.charAt(i)<='z')){
flag=false;
}
}
if(flag){
return true;
}
return false;
}
}
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
示例1:
输入:"aabcccccaaa"
输出:"a2b1c5a3"
示例2:输入:"abbccd"
输出:"abbccd"
解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。
提示:字符串长度在[0, 50000]范围内。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/compress-string-lcci
class Solution {
public String compressString(String S) {
int i=0;
int j=0;
String ans="";
int count=0;
while(true){
if(i>=S.length()){
break;
}
if(S.charAt(i)==S.charAt(j)){
count++;
}else{
ans+=S.charAt(j);
ans+=String.valueOf(count);
count=1;
j=i;
}
if(i==S.length()-1){
ans+=S.charAt(j);
ans+=String.valueOf(count);
count=1;
j=i;
}
i++;
}
if(S.length()<=ans.length()){
return S;
}else{
return ans;
}
}
}
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如
"Aa"
不能当做一个回文字符串。注意:
假设字符串的长度不会超过 1010。示例 1:
输入: "abccccdd" 输出: 7 解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
class Solution {
public int longestPalindrome(String s) {
int[] nums = new int[123];
for(int i=0;i