为什么此代码不适用于 hackerrank?
Why this code is not working on hackerrank?
我正在 Hackerrank 上解决一个问题,你可以在-https://www.hackerrank.com/challenges/journey-to-the-moon
上阅读
使用以下代码输出不正确
我已经在该代码中实现了所有必需的数据结构,并尝试创建连接组件大小的数组。
import java.io.*;
import java.util.*;
public class Solution {
public static void main(String[] args) throws Exception{
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
String[] temp = bfr.readLine().split(" ");
int N = Integer.parseInt(temp[0]);
int I = Integer.parseInt(temp[1]);
Solution sol=new Solution();
Graph g = sol.new Graph(N);
for(int i = 0; i < I; i++){
temp = bfr.readLine().split(" ");
int a = Integer.parseInt(temp[0]);
int b = Integer.parseInt(temp[1]);
g.addEdge(a,b);
// Store a and b in an appropriate data structure of your choice
}
CC ccg=sol.new CC(g);
int len=ccg.getComp();
long combinations = 0;
for(int k=0;k<len;k++){
if(k==0){
combinations+=ccg.getNum(k);
}else{
combinations*=ccg.getNum(k);
}
}
// Compute the final answer - the number of combinations
System.out.println(combinations);
}
class Graph{
final int s;
Bag[] adj;
public Graph(int si){
s=si;
adj=new Bag[s];
for(int i=0;i<si;i++){
adj[i]=new Bag();
}
}
public void addEdge(int i,int j){
adj[i].add(j);
adj[j].add(i);
}
public int graphSize(){
return s;
}
public Iterable<Integer> adj(int v){
return adj[v];
}
}
class Bag implements Iterable<Integer>{
Node first;
int size=0;
final class Node{
int i;
Node next;
}
public void add(int x){
Node old=first;
first=new Node();
first.i=x;
first.next=old;
size++;
}
public int getSize(){
return size;
}
public Iterator<Integer> iterator() {
// TODO Auto-generated method stub
return new ListIterator();
}
public class ListIterator implements Iterator<Integer>{
private Node current=first;
public boolean hasNext(){
return current!=null;
}
public void remove(){}
public Integer next(){
int i=current.i;
current=current.next;
return i;
}
}
}
class CC{
private boolean[] marked;
private int[] id;
private int[] comp;
private int count=0;
public CC(Graph g){
int i=g.graphSize();
marked=new boolean[i];
id=new int[i];
comp=new int[i];
for(int j=0;j<i;j++){
comp[j]=0;
}
for(int v=0;v<i;v++){
if(!marked[v]){
dfs(g,v);
count++;
}
comp[count]=comp[count]+1;
}
}
public int getComp(){
return count;
}
public int getNum(int i){
return comp[i];
}
private void dfs(Graph g,int v){
marked[v]=true;
id[v]=count;
for(int w:g.adj[v]){
if(!marked[w]){
dfs(g,w);
}
}
}
}
}
我已经对你的程序进行了几次测试。
在所有运行中,您的程序都打印了 0。虽然 0 在某些情况下是正确的输出,但在我的所有情况下都不是正确的输出。所以这可能是 Hackerrank 拒绝您的程序的原因之一。输入示例:
3 1
0 2
我的意思是描述 2 个国家,宇航员 0 和 2 来自一个国家,宇航员 1 来自其他国家。
预期输出:2
。程序的实际输出:0
.
(我已经编辑了这一段。)似乎如果所有对的 A
等于 B
,你将得到一个 ArrayIndexOutOfBoundsException
。例如:
1 1
0 0
我在 Hackerrank 规则中没有看到任何禁止 A == B
,所以我想你应该考虑一下。
正如我在评论中所说,我并不是要深入研究您的程序以了解其行为为何如我所描述的那样;我只是在观察并向您报告。我会把调试留给你自己。
我正在 Hackerrank 上解决一个问题,你可以在-https://www.hackerrank.com/challenges/journey-to-the-moon
上阅读使用以下代码输出不正确
我已经在该代码中实现了所有必需的数据结构,并尝试创建连接组件大小的数组。
import java.io.*;
import java.util.*;
public class Solution {
public static void main(String[] args) throws Exception{
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
String[] temp = bfr.readLine().split(" ");
int N = Integer.parseInt(temp[0]);
int I = Integer.parseInt(temp[1]);
Solution sol=new Solution();
Graph g = sol.new Graph(N);
for(int i = 0; i < I; i++){
temp = bfr.readLine().split(" ");
int a = Integer.parseInt(temp[0]);
int b = Integer.parseInt(temp[1]);
g.addEdge(a,b);
// Store a and b in an appropriate data structure of your choice
}
CC ccg=sol.new CC(g);
int len=ccg.getComp();
long combinations = 0;
for(int k=0;k<len;k++){
if(k==0){
combinations+=ccg.getNum(k);
}else{
combinations*=ccg.getNum(k);
}
}
// Compute the final answer - the number of combinations
System.out.println(combinations);
}
class Graph{
final int s;
Bag[] adj;
public Graph(int si){
s=si;
adj=new Bag[s];
for(int i=0;i<si;i++){
adj[i]=new Bag();
}
}
public void addEdge(int i,int j){
adj[i].add(j);
adj[j].add(i);
}
public int graphSize(){
return s;
}
public Iterable<Integer> adj(int v){
return adj[v];
}
}
class Bag implements Iterable<Integer>{
Node first;
int size=0;
final class Node{
int i;
Node next;
}
public void add(int x){
Node old=first;
first=new Node();
first.i=x;
first.next=old;
size++;
}
public int getSize(){
return size;
}
public Iterator<Integer> iterator() {
// TODO Auto-generated method stub
return new ListIterator();
}
public class ListIterator implements Iterator<Integer>{
private Node current=first;
public boolean hasNext(){
return current!=null;
}
public void remove(){}
public Integer next(){
int i=current.i;
current=current.next;
return i;
}
}
}
class CC{
private boolean[] marked;
private int[] id;
private int[] comp;
private int count=0;
public CC(Graph g){
int i=g.graphSize();
marked=new boolean[i];
id=new int[i];
comp=new int[i];
for(int j=0;j<i;j++){
comp[j]=0;
}
for(int v=0;v<i;v++){
if(!marked[v]){
dfs(g,v);
count++;
}
comp[count]=comp[count]+1;
}
}
public int getComp(){
return count;
}
public int getNum(int i){
return comp[i];
}
private void dfs(Graph g,int v){
marked[v]=true;
id[v]=count;
for(int w:g.adj[v]){
if(!marked[w]){
dfs(g,w);
}
}
}
}
}
我已经对你的程序进行了几次测试。
在所有运行中,您的程序都打印了 0。虽然 0 在某些情况下是正确的输出,但在我的所有情况下都不是正确的输出。所以这可能是 Hackerrank 拒绝您的程序的原因之一。输入示例:
3 1
0 2
我的意思是描述 2 个国家,宇航员 0 和 2 来自一个国家,宇航员 1 来自其他国家。
预期输出:2
。程序的实际输出:0
.
(我已经编辑了这一段。)似乎如果所有对的 A
等于 B
,你将得到一个 ArrayIndexOutOfBoundsException
。例如:
1 1
0 0
我在 Hackerrank 规则中没有看到任何禁止 A == B
,所以我想你应该考虑一下。
正如我在评论中所说,我并不是要深入研究您的程序以了解其行为为何如我所描述的那样;我只是在观察并向您报告。我会把调试留给你自己。