第185场力扣周赛题解

5388. 重新格式化字符串

思路:做法很多,我的方法是定义两个队列分别存数字和字符,然后在满足题目要求能够格式化的情况下穿插着加入答案即可。

class Solution {
	
	StringBuilder str;
	
    public String reformat(String s) {
    	
    	if(s.length()<=1) return s;
    	
    	int n=s.length();  	
    	str=new StringBuilder();
    	
    	Queue q1=new LinkedList<>();
    	Queue q2=new LinkedList<>();
    	
    	for(int i=0;i='0' && s.charAt(i)<='9') q1.add(s.charAt(i));
    		else q2.add(s.charAt(i));
    	}
    	
    	if(Math.abs(q1.size()-q2.size())>1) return "";
    	
        if(q1.size()>q2.size()) work(q1,q2);
        else work(q2,q1);
        
    	return str.toString();
    }
    
    private void work(Queue q1,Queue q2) {
    	
    	while(!q1.isEmpty()) {
    		str.append(q1.poll());
    		if(!q2.isEmpty())
    			str.append(q2.poll());
    	}
    }
}

5389. 点菜展示表

思路:数据结构的考察,比较中规中矩的题目,没有需要思考的地方,无非是每个人存储信息的方式不同。我采用map里嵌套map的形式存储每个桌对应的id和该桌点的菜以及对应的数量。

class Solution {
    public List> displayTable(List> orders) {
    	
    	List res=new ArrayList<>();
    	List caiList=new ArrayList<>();
    	Map flag=new HashMap<>();
    	List> ans=new ArrayList<>();
    	Map> peoples=new HashMap<>();
    	
    	for(int i=0;i());
    		peoples.get(num).put(cai, peoples.get(num).getOrDefault(cai, 0)+1);
    		if(flag.containsKey(cai))
    			continue;
    		flag.put(cai, caiList.size());
    		caiList.add(cai);
    		
    	}
    	
    	List ids=new ArrayList<>();
    	for(String id : peoples.keySet()) 
    		ids.add(Integer.valueOf(id));
    	
    	int len=caiList.size();
    	String[] caiNames=new String[len];
    	
    	for(int i=0;i(res));
    	
    	for(int i=0;i(res));
    	}
    	
    	return ans;
    }
}

5390. 数青蛙

思路:‘croak’是顺序固定的,因此我们可以线性遍历,当遇到k前边没有c时返回-1,当遇到o前边没有r时返回-1,....,以此类推。并在该过程中记录的当前c的最大值一定是所要求的最小值。

class Solution {
    public int minNumberOfFrogs(String croakOfFrogs) {
    	
    	int ans=0;
    	int n=croakOfFrogs.length();
    	
    	if(n%5!=0) return -1;

    	int num=0;
    	int[] nums=new int[5];
    	
    	for(int i=0;i

5391. 生成数组

思路:动态规划,定义dp[i][j][k]:表示组成了i个数,最大数为j并且最长严格递增序列长度为k的方案数。

class Solution {
	
	private int mod=1000000007;
	
    public int numOfArrays(int n, int m, int k) {

    	long[][][] dp=new long[n+1][m+1][k+1];
    	
    	for(int i=1;i<=m;i++)
    		dp[1][i][1]=1;
    	
    	for(int i=2;i<=n;i++)
    		for(int h=1;h<=k;h++) {
    			long sm=0;
    			for(int j=1;j<=m;j++) {
    				dp[i][j][h]=1L*j*dp[i-1][j][h]%mod;
    				dp[i][j][h]=(dp[i][j][h]+sm)%mod;
    				sm=(sm+dp[i-1][j][h-1])%mod;
    			}
    		}
    	
    	long ans=0;
    	for(int i=1;i<=m;i++)
    		ans=(ans+dp[n][i][k])%mod;
    	
    	return (int)ans;
    	
    }
}

 

你可能感兴趣的:(第185场力扣周赛题解)