Leetcode java Day4

这篇博客探讨了多种算法问题的解决方案,包括判断回文数、罗马数字转整数、查找数组中拥有最多糖果的孩子、数组重新排列以及寻找最长公共前缀。通过实例代码展示了如何高效地解决这些问题,涉及到了栈、哈希表和字符串操作等编程技巧。
摘要由CSDN通过智能技术生成

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
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值