算法思路:
1.统计出人数;
2.算出房间数k;
3.计算比Elly大的人数count;
4. 根据count和k计算概率。
遇到的Bug:
题意没读清楚,必须把所有的ratings[i]连起来,否则会出问题。
题意没读清楚,以为会有重复的,所以用了hashMap来标记,但不影响算法正确性。
count=0的时候,应该返回1。
菜鸟好不容易调试通过的代码:
import java.util.*; import java.util.regex.*; import java.text.*; import java.math.*; public class EllysRoomAssignmentsDiv2 { public double getProbability(String[] ratings) { int N,R,count; int i; String[] strs; String lstr = new String(); String elly = new String(); HashMap mp = new HashMap(); for(i=0;i<ratings.length;i++){ lstr+=ratings[i]; } strs = lstr.split(" "); elly = strs[0]; count=0; N=0; for(i=0;i<strs.length;i++){ if(strs[i].length()>0&&!mp.containsKey(strs[i])){ mp.put(strs[i],true); N++; // System.out.println(N+",str="+strs[i]); } if(cmp(strs[i],elly)>0) count++; } //System.out.println(N); if(N%20==0) R=N/20; else R=N/20+1; if(count==0) return 1; else if(R>count) return 0; else return 1.0/R; } private int cmp(String str1,String str2){ if(str1.length()!=str2.length()) return str1.length() - str2.length(); else return str1.compareTo(str2); } } //Powered by KawigiEdit 2.1.4 (beta) modified by pivanof!
Java大神的代码:
import java.util.*; import java.util.regex.*; import java.text.*; import java.math.*; import java.awt.geom.*; public class EllysRoomAssignmentsDiv2 { public double getProbability(String[] ratings) { StringBuilder sb=new StringBuilder(); for(String s:ratings)sb.append(s); String[]str=sb.toString().split(" "); int[]rat=new int[str.length]; for(int i=0;i<rat.length;i++){ rat[i]=Integer.parseInt(str[i]); } int el=rat[0]; int n=rat.length; Arrays.sort(rat); int num=-1; for(int i=n;i-->0;){ if(rat[i]==el){ num=n-i; break; } } int r=0; if(n%20==0){ r=n/20; }else{ r=n/20+1; } //System.out.println(num); if(r==1)return 1.0; if(num==1)return 1.0; if(num>r){ return (double)1/r; }else return 0.0; } } //Powered by [KawigiEdit] 2.0!
C++大神的代码:
#include <algorithm> #include <cassert> #include <sstream> #include <vector> #include <string> #include <iostream> using namespace std; class EllysRoomAssignmentsDiv2 { public: double getProbability(vector <string> ratings) { string rating; for (int i = 0; i < ratings.size(); ++i) rating += ratings[i]; istringstream iss(rating); vector<int> regs; int member; while (iss >> member) regs.push_back(member); int elly = regs[0]; sort(regs.begin(), regs.end(), greater<int>()); if (regs[0] == elly) return 1.0; int pos = 0; for (; pos < regs.size() && regs[pos] > elly; ++pos) ; assert(regs[pos] == elly); int N = regs.size(); int R = (N + 19) / 20; cout << N << ' ' << R << endl; if (pos < R) return 0.0; return 1.0 / R; } };
分析:
算法:Simple Math, Sorting, String Parsing
对比:
1.大神的算法都差不多。
2.C++大神的这句用得好:R = (N + 19) / 20;
3.因为没有读清楚题,我的算法可以处理任意长度的字符串,不用转化为int型。
总结:
算法挺简单,但是因为我没有认真读题,导致犯了不少错误,调试花了不少时间。