文章目录
简单题
罗马数字转整数
解题思路
- 将字符串拆分放到字符数组里面。
- 将特殊情况依次写出来,记住当两个字符满足上述关系时,同时需要加上i+1,避免i重复使用。
- 其余情况直接加上相应数字即可
解题代码
class Solution {
public int romanToInt(String s) {
int sum=0;
char[] s1=new char[s.length()+1];
for(int i=0;i<s.length();i++){
s1[i]=s.charAt(i);
}
for(int i=0;i<s.length()+1;i++){
if(s1[i]=='X'&&s1[i+1]=='L'){
sum+=40;
i=i+1;
}else if(s1[i]=='X'&&s1[i+1]=='C'){
sum+=90;
i=i+1;
}else if(s1[i]=='I'&&s1[i+1]=='V'){
sum+=4;
i=i+1;
}else if(s1[i]=='I'&&s1[i+1]=='X'){
sum+=9;
i=i+1;
}else if(s1[i]=='C'&&s1[i+1]=='D'){
sum+=400;
i=i+1;
}else if(s1[i]=='C'&&s1[i+1]=='M'){
sum+=900;
i=i+1;
}else if(s1[i]=='M'){
sum+=1000;
}else if(s1[i]=='I'){
sum+=1;
}else if(s1[i]=='X'){
sum+=10;
}
else if(s1[i]=='V'){
sum+=5;
}
else if(s1[i]=='C'){
sum+=100;
}else if(s1[i]=='D'){
sum+=500;
}else if(s1[i]=='L'){
sum+=50;
}
}
return sum;
}
}
删除有序数组中的重复项
解题思路
- 先定义一个与原数组长度相同的目标数组e
- 题目说了,数组升序。可以通过第一个比第二个、第二个比第三个…的思想去删除重复数字,(相同的元素一定在旁边,升序)
- 当i与i+1元素相同时,通过将从下标i+1到下标结束往前移一位,即删去下标为i的这个元素,同时保留i+1
- 删除完元素后,数组也重新更新,i-1是因为i后面的元素都移前一位,i+1这个元素变成i,所有i-1,同时数组大小也要-1
解题代码
class Solution {
public int removeDuplicates(int[] nums) {
int[] e=new int[nums.length];
int sum=0;
int len=nums.length;
for(int i=0;i<len-1;i++){
if(nums[i]==nums[i+1]){
sum++;
for(int j=i;j<len-1;j++){
nums[j]=nums[j+1];
}
i--;
len--;
}
}
return len;
}
}
斐波那契数
解题思路
- 找到终止条件n=0,f=0,n=1,f=1
- 题目给出了递归关系F(n) = F(n - 1) + F(n - 2)
- 进行递归思想列出f=fib(n-1)+fib(n-2);即可
解题代码
class Solution {
public int fib(int n) {
int f;
if(n==0){
f=0;
}
else if(n==1){
f=1;
}else{
f=fib(n-1)+fib(n-2);
}
return f;
}
}
检测大写字母
解题思路
- 对字符串进行拆分,定义flag=true.定义两个变量a=0,b=0分别记录大写以及小写的个数
- 第一种情况:都为大写字母 a=word.length
- 第二种情况:都为小写字母 b=word.length
- 第三种情况:第一个为大写其余小写(b=word.length()-a)同时满足都一个为大写
- 其余flag=false
- 返回flag
解题代码
class Solution {
public boolean detectCapitalUse(String word) {
int a=0,b=0;
boolean flag=true;
for(int i=0;i<word.length();i++){
if(word.charAt(i)>='A'&&word.charAt(i)<='Z'){
a++;
}
if(word.charAt(i)>='a'&&word.charAt(i)<='z'){
b++;
}
}
if(a==word.length()||b==word.length()){
flag=true;
}else if((b==word.length()-a)&&a==1&&(word.charAt(0)>='A'&&word.charAt(0)<='Z')){
flag=true;
}else {
flag=false;
}
return flag;
}
}
中等题
只出现一次的数字II
解题思路
- 我是先对数组进行了排序,通过Arrays.sort
- 我分了几种特殊情况(找到只出现一次数字的下标定义为b)
- 1.如果只有一个元素,直接返回
- 2.如果最后一个元素与前一个元素不等,b=nums.length-1
- 3.如果第一个元素与第二个元素不等,b=0
- 4.即不再第一个,也不再最后一个,通过比较,如果该下标元素不等于前一个也不等于后一个,b=i
- 5.返回nums[b]
解题代码
class Solution {
public int singleNumber(int[] nums) {
Arrays.sort(nums);
int b=0;
if(nums.length==1){
b=0;
} else if(nums[0]!=nums[1]){
b=0;
}else if(nums[nums.length-1]!=nums[nums.length-2]){
b=nums.length-1;
}else{
for(int i=1;i<nums.length-1;i++){
if(nums[i]!=nums[i+1]&&nums[i]!=nums[i-1]){
b=i;
}
}
}
return nums[b];
}
}