Leetcode183周赛

排名:252 / 3754

第一题:非递增顺序的最小子序列
解题思路:先给原数组排个序,统计一下sum;之后从大到小,累加和temp,当temp>sum-temp就满足了题目要求。

class Solution {
    public List minSubsequence(int[] nums) {
        int n = nums.length;
		int max = 0;
		for (int i = 0; i < n; i++) {
			max+=nums[i];
		}
		Arrays.sort(nums);
		List ans = new ArrayList<>();
		int temp = 0;
		for (int i = n-1; i >=0 ; i--) {
			ans.add(nums[i]);
			temp+=nums[i];
			max-=nums[i];
			if (temp>max)return ans;
		}
		return ans;
    }
}

第二题:将二进制表示减到 1 的步骤数
解题思路:这题是给一个二进制的数(用String的形式表示),由于String的长度给的范围上限是500,所以肯定不能够转成int做。这里就直接利用2进制的性质,判断单复数直接判断最后一位是0还是1,偶数除2的话就是将最后一位删掉,奇数加一的话就相当于0->1类似进位。然后模拟一下题目就能够过去。

class Solution {
    public int numSteps(String s) {
        StringBuilder sb = new StringBuilder(s);
		StringBuilder reverse = sb.reverse();
		int ans = 0;
		while (reverse.length()>1){
			ans++;
			if (reverse.charAt(0)=='0'){
				reverse.deleteCharAt(0);
			}else {
				int flag = 0;
				for (int i = 0; i < reverse.length(); i++) {
					if (reverse.charAt(i)=='0'){
						reverse.replace(i,i+1,"1");
						flag=1;
						break;
					}else {
						reverse.replace(i,i+1,"0");
					}
				}
				if (flag==0){
					reverse.append('1');
				}
			}
		}
		return reverse.charAt(0)=='1'?ans:ans+1;
    }
}

第三题:最长快乐字符串
解题思路:题目提供3个种类的字符(a,b,c)以及它们相应的个数且构造的字符中不能够有连续的三个字符如:aaa、bbb、ccc等。这里的思路就是将个数最多的字符,先去连接,并且根据字符串末尾的字符来进行重排。直至全部用完,或者除了末尾字符的另两种字符为0。这里我是直接利用dfs来进行模拟了。

class Solution {
    public String longestDiverseString(int a, int b, int c) {
		StringBuilder sb = new StringBuilder();
		dfs5195(sb,a,b,c);
		return sb.toString();
	}
	public void dfs5195(StringBuilder sb,int a,int b,int c){
		if (a==0 && b==0 && c==0)return;
		if (sb.length()>0){
			char c1 = sb.charAt(sb.length()-1);
			if (c1=='a' && b==0 && c==0)return;
			if (c1=='b' && a==0 && c==0)return;
			if (c1=='c' && b==0 && a==0)return;
		}
		if (sb.length()==0){
			if (a>=b && a>=c){
				if (a>=2) {
					sb.append("aa");
					a-=2;
				}else {
					sb.append('a');
					a--;
				}
			} else if (b>=a && b>=c){
				if (b>=2) {
					sb.append("bb");
					b-=2;
				}else {
					sb.append('b');
					b--;
				}
			}else if (c>=a && c>=b){
				if (c>=2) {
					sb.append("cc");
					c-=2;
				}else {
					sb.append('c');
					c--;
				}
			}
		}else {
			char last = sb.charAt(sb.length()-1);
			if (last=='a'){
				if (b>=c){
					if (a>b){
						sb.append('b');
						b--;
					}else if (b>=2) {
						sb.append("bb");
						b-=2;
					}else {
						sb.append('b');
						b--;
					}
				}else {
					if (a>c){
						sb.append('c');
						c--;
					}else if (c>=2) {
						sb.append("cc");
						c-=2;
					}else {
						sb.append('c');
						c--;
					}
				}
			}else if (last=='b'){
				if (a>=c){
					if (b>a){
						sb.append('a');
						a--;
					}else if (a>=2) {
						sb.append("aa");
						a-=2;
					}else {
						sb.append('a');
						a--;
					}
				}else {
					if (b>c){
						sb.append('c');
						c--;
					}else if (c>=2) {
						sb.append("cc");
						c-=2;
					}else {
						sb.append('c');
						c--;
					}
				}
			}else if (last=='c'){
				if (a>=b){
					if (c>a){
						sb.append('a');
						a--;
					}else if (a>=2) {
						sb.append("aa");
						a-=2;
					}else {
						sb.append('a');
						a--;
					}
				}else {
					if (c>b){
						sb.append('b');
						b--;
					}else if (b>=2) {
						sb.append("bb");
						b-=2;
					}else {
						sb.append('b');
						b--;
					}
				}
			}
		}
		dfs5195(sb,a,b,c);
	}
}

你可能感兴趣的:(LeetCode,java,leetcode,dfs,字符串)