【题意】根据一些输入串plates[i],推断设备在每一位上的运算逻辑是OR,AND还是XOR,如果可以明确推断出,return "YES",否则 return "NO"。
【分析】刚开始自己搞得有点复杂,下面是某位大神的分析:
显然位与位之间互相独立,那么单独考虑一位,这是只有三种输入:(0,0),(0,1),(1,1)。能区别AND和OR的有(0,1);能区别AND和XOR的有(0,1)和(1,1);能区别OR和XOR的有(1,1)。只要分别统计M个串中每一位0和1的个数,再判断一下即可.
【算法】:
1.分别统计每一位的0和1的个数。至少需要2个1和1个0。
2.判断能否推断。
【Java代码】来自菜鸟
1 import java.util.*; 2 import java.util.regex.*; 3 import java.text.*; 4 import java.math.*; 5 6 7 public class TheDeviceDiv2 8 { 9 public String identify(String[] plates) 10 { 11 int one,zero; 12 int i,j; 13 14 for(i=0;i<plates[0].length();i++){ 15 one=zero=0; 16 for(j=0;j<plates.length;j++){ 17 if(plates[j].charAt(i)=='1') 18 one++; 19 else 20 zero++; 21 } 22 if(one<2||zero<1) 23 return "NO"; 24 } 25 return "YES"; 26 } 27 28 29 } 30 //Powered by KawigiEdit 2.1.4 (beta) modified by pivanof!
【Java代码】来自大神
import java.util.*; import java.util.regex.*; import java.text.*; import java.math.*; public class TheDeviceDiv2 { public String identify(String[] plates) { for (int i = 0; i < plates[0].length(); i++) { int onecount = 0; int zerocount = 0; for (int j = 0; j < plates.length; j++) { if (plates[j].charAt(i) == '0') zerocount++; else onecount++; } if (!(onecount >= 2 && zerocount >= 1)){ return "NO"; } } return "YES"; } } //Powered by KawigiEdit 2.1.4 (beta) modified by pivanof!
【C++代码】来自大神
#include <vector> #include <list> #include <map> #include <set> #include <queue> #include <deque> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <ctime> #include <cstring> #include <climits> using namespace std; class TheDeviceDiv2 { public: string identify(vector <string> p) { for(int j=0;j<p[0].length();j++){ int o=0,z=0; for(int i=0;i<p.size();i++){ if(p[i][j]=='1')o++; else z++; } if(o>=2&&z>=1)continue; else return "NO"; } return "YES"; } }; //Powered by KawigiEdit 2.1.8 (beta) modified by pivanof!
【总结】:大神的方法都是一样的,看来这道题也是到经典题。