【LeetCode】482.密钥格式化、492. 构造矩形、506.相对名次、507.完美数

482. 密钥格式化
给定一个密钥字符串S,只包含字母,数字以及 '-'(破折号)。N 个 '-' 将字符串分成了 N+1 组。给定一个数字 K,重新格式化字符串,除了第一个分组以外,
每个分组要包含 K 个字符,第一个分组至少要包含 1 个字符。两个分组之间用 '-'(破折号)隔开,并且将所有的小写字母转换为大写字母。
给定非空字符串 S 和数字 K,按照上面描述的规则进行格式化。

示例 1:
输入:S = "5F3Z-2e-9-w", K = 4
输出:"5F3Z-2E9W"
解释:字符串 S 被分成了两个部分,每部分 4 个字符;
     注意,两个额外的破折号需要删掉。
    
示例 2:
输入:S = "2-5g-3-J", K = 2
输出:"2-5G-3J"
解释:字符串 S 被分成了 3 个部分,按照前面的规则描述,第一部分的字符可以少于给定的数量,其余部分皆为 2 个字符。
 
提示:
S 的长度不超过 12,000,K 为正整数
S 只包含字母数字(a-z,A-Z,0-9)以及破折号'-'
S 非空

分析:
方法一:
由于除了第一个分组,其他分组的字符都必须是K个,因此从后向前遍历S,K个分一组,大小写转换后存入字符串res中,每一组存入后都添加"-",需要注意的是按组存入顺序也是由后往前,最后返回res。
方法二:
先将S大小写转换,去除S中所有的"-",再由后向前K个分一组插入"-"。

代码:

public class Test_0210 {
	public static void main(String[] args) {
		Solution So = new Solution();
		String S = "5F3Z-2e-9-w";
		int K = 4;
		System.out.println(So.licenseKeyFormatting2(S, K));
	}
}
class Solution {
    public String licenseKeyFormatting1(String S, int K) {
        String res = "";
        for(int i=S.length()-1; i>=0; i--){
        	if(S.charAt(i) != '-'){
        		if(res == "" || (res.length()+1) % (K+1) != 0){
        			if('a'<=S.charAt(i) && S.charAt(i) <='z'){
        				res = String.valueOf(Character.toUpperCase(S.charAt(i))) + res;
        			}
        			else{
        				res = String.valueOf(S.charAt(i)) + res;
        			}
            	}
        		else{
        			res="-"+res;
        			i++;
        		}
        	}
        }
        return res;
    }
    public String licenseKeyFormatting2(String S, int K) {
    	S = S.toUpperCase().replace("-","");
    	StringBuilder s = new StringBuilder(S);
    	for(int i=S.length()-K; i>0; i-=K){
    		s.insert(i,"-");
    	}
    	return String.valueOf(s);
    }
}

492. 构造矩形
作为一位web开发者, 懂得怎样去规划一个页面的尺寸是很重要的。 现给定一个具体的矩形页面面积,你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面。要求:
1. 你设计的矩形页面必须等于给定的目标面积。
2. 宽度 W 不应大于长度 L,换言之,要求 L >= W 。
3. 长度 L 和宽度 W 之间的差距应当尽可能小。
你需要按顺序输出你设计的页面的长度 L 和宽度 W。
示例:
输入: 4
输出: [2, 2]
解释: 目标面积是 4, 所有可能的构造方案有 [1,4], [2,2], [4,1]。
但是根据要求2,[1,4] 不符合要求; 根据要求3,[2,2] 比 [4,1] 更能符合要求. 所以输出长度 L 为 2, 宽度 W 为 2。
说明:
给定的面积不大于 10,000,000 且为正整数。
你设计的页面的长度和宽度必须都是正整数。

 分析:
 宽的初始数为根号下area,长为area/宽,从宽的初始值开始向更小的数遍历(每次减1),直到长乘宽等于area,此时在满足要求的条件下长和宽之间的差距最小。

代码:

public class Test_0210 {
	public static void main(String[] args) {
		Solution So = new Solution();
		int area = 2;
		int[] nums = So.constructRectangle(area);
		for(int i=0; i<nums.length; i++){
			System.out.print(nums[i]+" ");
		}
	}
}
class Solution {
    public int[] constructRectangle(int area) {
    	int[] nums={area/(int) Math.sqrt(area),(int)Math.sqrt(area)};
        while(nums[0] * nums[1] != area){
        	nums[1]-=1;
        	nums[0]=area/nums[1];
        }
        return nums;
    }
}

506. 相对名次
给出 N 名运动员的成绩,找出他们的相对名次并授予前三名对应的奖牌。前三名运动员将会被分别授予 “金牌”,“银牌” 和“ 铜牌”("Gold Medal", "Silver Medal", "Bronze Medal")。
(注:分数越高的选手,排名越靠前。)

示例 1:
输入: [5, 4, 3, 2, 1]
输出: ["Gold Medal", "Silver Medal", "Bronze Medal", "4", "5"]
解释: 前三名运动员的成绩为前三高的,因此将会分别被授予 “金牌”,“银牌”和“铜牌” ("Gold Medal", "Silver Medal" and "Bronze Medal").
余下的两名运动员,我们只需要通过他们的成绩计算将其相对名次即可。
提示:
N 是一个正整数并且不会超过 10000。
所有运动员的成绩都不相同。

 分析:
 先将nums中的内容以字符串的形式备份到数组array中,再将nums排序,然后对照nums数组中的顺序修改array的内容,
 遍历array数组,在nums中找到与此数相同的数的索引i,如果索引等于nums.length-1、nums.length-2 或 nums.length-3,将array中此字符串对应改为"Gold Medal", "Silver Medal" 或 "Bronze Medal",
 其他情况下将nums.length-i转为字符串来替换array中原字符串,结束后返回数组array。

代码:

public class Test_0211 {
	public static void main(String[] args) {
		int[] nums ={5, 4, 3, 2, 1};
		Solution So = new Solution();
		String[] array = So.findRelativeRanks(nums);
		for(int i=0; i<array.length; i++){
			System.out.print(array[i]+", ");
		}
	}
}

class Solution {
    public String[] findRelativeRanks(int[] nums) {
        String[] array = new String[nums.length] ;
        //备份数组
        for(int i=0; i<nums.length; i++){
        	array[i] = String.valueOf(nums[i]);
        }
        //数组排序
        Arrays.sort(nums);
        for(int j=0; j<array.length; j++){
        	for(int i=nums.length-1; i>=0; i--){
        		if(array[j].equals(String.valueOf(nums[i]))){
        			if(i == nums.length-1)
        				array[j] = "Gold Medal";
        			else if(i == nums.length-2)
        				array[j] = "Silver Medal";
        			else if(i == nums.length-3)
        				array[j] = "Bronze Medal";
        			else{
        				array[j] = String.valueOf(nums.length-i);
        			}
        			break;
        		}
        	}
        }
        return array;
    }
}

507. 完美数
对于一个 正整数,如果它和除了它自身以外的所有正因子之和相等,我们称它为“完美数”。
给定一个 正整数 n, 如果他是完美数,返回 True,否则返回 False

示例:
输入: 28
输出: True
解释: 28 = 1 + 2 + 4 + 7 + 14
注意:
输入的数字 n 不会超过 100,000,000. (1e8)

分析:
用temp存num除自身以外的所有正因子之和,temp初始为1,从i=(int)Math.sqrt(num)向下(i每次减一,i>1,)遍历,如果num%i等于0,则说明i、num/i是num的正因子,则temp += (i+num/i),
由于1是特例,只有正因子1,且是它本身,因此若num=1,temp-=1,最后返回temp。

代码:

public class Test_0211 {
	public static void main(String[] args) {
		int num = 1;
		Solution So = new Solution();
		if(So.checkPerfectNumber(num))
			System.out.println(num+"是完美数");
		else
			System.out.println(num+"不是完美数");
		
	}
}
class Solution {
    public boolean checkPerfectNumber(int num) {
    	int temp = 1;
        for(int i=(int)Math.sqrt(num); i>1; i--){
        	if(num % i == 0)
        		temp += (i+num/i);
        }
        if(num == 1)
        	temp-=1;
        return temp == num;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值