【发布时间】:2020-02-29 02:22:47
【问题描述】:
请注意: 这个问题很长,可能需要一些时间阅读:
我在编码测试中遇到了这个问题:
假设我们有一个 2 行 N 列的 0-1 矩阵,假设 U=the 上排之和,L=下排之和,int[] C=数组 包含每列的总和,返回字符串表示 矩阵。如果有多个,则返回其中任何一个。如果不 矩阵满足,返回“IMPOSSIBLE”。
例子1:
U=3,L=2,C=[2,1,1,0,1] return String="11100,10001"(两行是 用“,”分隔)
我通过以下方法得到了 50% 的正确率和 14% 的速度:
我的想法:
- 如果 U+L != C 中元素的总和,则返回“IMPOSSIBLE”;
- 否则,用 0 初始化矩阵,并使用 for 循环访问 C 中的每个元素:
如果 C[i]==2,则将每行中的元素设置为 1;
if C[i]==0 将每行中的元素设置为 0;
如果 C[i]==1 && 0 否则,将上排元素设置为 0,将下排元素设置为 1;- 最后我们访问矩阵中的每个元素,得到结果 String(with StringBuilder.append())。
谁能帮我改进它?
经过长时间的思考,我无法找到更好的解决方案。
我认为这个解决方案应该是 100% 正确的,O(N) 应该是最小时间复杂度,其中N 是矩阵元素的总数。
----更新:
class Solution {
public String solution(int U, int L, int[] C) {
// write your code in Java SE 8
int N=C.length;
int colSum=0;
for(int i=0;i<N;i++){
colSum+=C[i];
}
if(colSum!=U+L){
return "IMPOSSIBLE";
}
String[] upRow=new String[N];
String[] lowRow=new String[N];
for(int i=0;i<N;i++){
if(C[i]==2){
upRow[i]="1";
lowRow[i]="1";
U--;
L--;
}else if(C[i]==0){
upRow[i]="0";
lowRow[i]="0";
}else{
if(0<U){
upRow[i]="1";
lowRow[i]="0";
U--;
}else{
upRow[i]="0";
lowRow[i]="1";
}
}
}
StringBuilder sb=new StringBuilder();
for(int i=0;i<N;i++){
sb.append(upRow[i]);
}
sb.append(",");
for(int i=0;i<N;i++){
sb.append(lowRow[i]);
}
return sb.toString();
}
}
【问题讨论】:
-
如果你有 U=2 L=0 C=[2] 你的算法将返回 1,1 而不是认识到这是不可能的,这只是一个例子。至于速度14%我不知道是什么意思,是怎么计算的?发布您的代码。
-
@Oleg 这可以通过在字符串构造后检查矩阵是否满足标准来缓解。 (可能应该表示为一个数组以便于求和)
-
@Oleg 你是对的。如果 U 或 L 大于 C 中的非零元素计数,则它是不可能的。
-
@Oleg 我也不知道那 14%。我想这意味着只有 14% 的测试用例可以在时间限制内产生结果。
-
@Arch2K 我发布了一个基于 cmets 的解决方案,用不同的输入进行了测试,似乎可行。