Leetcode java Day4
1431.拥有最多糖果的孩子
错误思路:
1)用candies数组加extraCandies 导致所有值变大,无法比较。
2)卡在如果满足条件后,执行到最后一个元素就判断值为true
public static List<Boolean> kidsWithCandies(int[] candies, int extraCandies) {
List<Boolean> faye =new LinkedList<>();//双向链表,增删元素快
int n=candies.length;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) { //如果出现大于它跳出
if(candies[j]>(candies[i]+extraCandies)){ //有元素大于它
faye.add(false);
break; //
}
if(j==candies.length-1) faye.add(true); //执行到最后一个元素,每个判断一次
}
}
return faye;
}
思路,想成为最多糖果的孩子,只需比较一次(最多那个)就可以判断
class Solution {
public static List<Boolean> kidsWithCandies(int[] candies, int extraCandies) {
List<Boolean> faye =new LinkedList<>();
int n=candies.length,max=candies[0];
for (int i : candies) { //找出数组最大值
if(i>max)
max=i;
}
for (int i : candies) {
if((i+extraCandies)>=max) //大于等于最大值即可判断true
faye.add(true);
else faye.add(false);
}
return faye;
}
}
1470.重新排列数组
运用栈实现,时间复制度和空间复制度太复杂
class Solution {
public int[] shuffle(int[] nums, int n) {
Stack<Integer> faye = new Stack<>();
for (int i = 0; i < n; i++) {
faye.add(nums[i]);
faye.add(nums[i+n]);
}
for (int i = nums.length-1; i>0 ; i--) {
nums[i]=faye.pop();
}
return nums;
}
}
找出 2i 和 2i+1 关系
class Solution {
public int[] shuffle(int[] nums, int n) {
int[] faye= new int [2*n];
for (int i = 0; i < n; i++) {
faye[2*i] =nums[i];
faye[2*i+1] =nums[i+n];
}
return faye;
}
}
运用双指针解法
class Solution {
public int[] shuffle(int[] nums, int n) {
int a=0;
int k=n;
int[] faye= new int [2*n]; //2*n==nums.length.
for(int i =0;i<2*n;i++){
if (i%2==0){
faye[i]=nums[a];
a++;
}
else{
faye[i]=nums[k];
k++;
}
}
return faye;
}
}
LCP 06.拿硬币
class Solution {
public int minCount(int[] coins) {
int n =0 ;
for (int i :coins){
/* if (i%2==0)
n+=i/2;
else{
n+=i/2+1;
} */
n+=i/2+i%2; //java int 3/2 截断为1
1}
return n;
}
}
9.回文数
public boolean isPalindrome(int x) {
String faye =x+""; //int +"" 会把x强制类型转换为String
String leslie =new StringBuffer(faye).reverse().toString();
return faye.equals(leslie);
}
StringBuffer()类的reverse(),反转字符串方法。
StringBuffer.toString()转换为字符串类型
13.罗马数字转整数
实现思路:如果出现IV IX 则让V X检测前面数字是否为I,此时前面已经+1,然后此时遇到V +5,再修改值-2即得到特殊情况IV=4。
public int romanToInt(String s) {
int sum = 0;
if(s.charAt(0)=='M')
sum+=1000;
if(s.charAt(0)=='D')
sum+=500;
if(s.charAt(0)=='C')
sum+=100;
if(s.charAt(0)=='L')
sum+=50;
if(s.charAt(0)=='X')
sum+=10;
if(s.charAt(0)=='V')
sum+=5;
if(s.charAt(0)=='I')
sum+=1;
for (int i = 1; i < s.length(); i++) {
if(s.charAt(i)=='M'){
sum+=1000;
if(s.charAt(i-1)=='C')
sum-=200;
}
if(s.charAt(i)=='D'){
sum+=500;
if(s.charAt(i-1)=='C')
sum-=200;
}
if(s.charAt(i)=='C'){
sum+=100;
if(s.charAt(i-1)=='X')
sum-=20;
}
if(s.charAt(i)=='L'){
sum+=50;
if(s.charAt(i-1)=='X')
sum-=20;
}
if(s.charAt(i)=='X'){
sum+=10;
if(s.charAt(i-1)=='I')
sum-=2;
}
if(s.charAt(i)=='V'){
sum+=5;
if(s.charAt(i-1)=='I')
sum-=2;
}
if(s.charAt(i)=='I')
sum+=1;
}
return sum;
}
换种思路,用哈希表实现
把对应的键-值加入,然后对字符串进行切片处理,两个两个检测。
若符合特殊情况则加相应的值。
public int romanToInt(String s) {
int sum =0 ;
HashMap<String,Integer> faye = new HashMap<>();
faye.put("I", 1);
faye.put("V", 5);
faye.put("X", 10);
faye.put("L", 50);
faye.put("C", 100);
faye.put("D", 500);
faye.put("M", 1000);
faye.put("IV", 4);
faye.put("IX", 9);
faye.put("XL", 40);
faye.put("XC", 90);
faye.put("CD", 400);
faye.put("CM", 900);
for (int i = 0; i < s.length(); i++) {
if(s.substring(i).length()<2) { //如果剩下字符串长度小于2
sum+=faye.get(s.substring(i)); //跳出循环
break;
} //s.substring ()不超它的长度
else if (faye.containsKey(s.substring(i,i+2))){ //切片后哈希表中含有特殊字符
sum+=faye.get(s.substring(i,i+2));
i++; //i+2
} // IV II I
else if(faye.containsKey(s.substring(i, i+1)))
sum+=faye.get(s.substring(i,i+1));
}
return sum;
}
关于s.substring(i)切片函数
14.最长公共前缀
public String longestCommonPrefix(String[] strs) {
String faye = strs[0]; // flower
for (String string : strs) {
while(!string.startsWith(faye)){//如果不以flower开头
if (faye.length()==0)
return "";
faye=faye.substring(0,faye.length()-1); //不是就切除最后一个
}
}
return faye;
}
String.startsWith()函数 (runoob,4)从数组下标4开始寻找runoob