poj3295:Tautology

2020-10-11 做题

传送门 题目大意 给定一个由10种字符(p,q,r,s,t,N,K,A,C,E)组成的逻辑表达式,其中pqrst为逻辑变量,NKACE为逻辑运算符,他们的含义分别是 K==and:x && yN==not:!xA==or:x || yC==implies:(!x)||y E==equals:x==y 要求判断这个逻辑表达式是否为重言式,如果是就输出tautology,否则输出not 思路 根据题设,我们不难判断,单目运算符一定在整个字符串的后半部分,双目运算符一定在整个字符串的前半部分。例如ApNp,它应该被判为A(p,N(p)),所以上述结论的正确性是显然的。那么就可以像常规的表达式计算一样,从尾部压入栈,然后弹一个计算一个。 因为只有5个逻辑变量,所以最多只会有2^5=32种情况,依次枚举就好。 代码 我的写法 五重循环枚举每一位,最内层去枚举长度。 ```cpp #include #include #include #include using namespace std; string str; bool input(stack& sta, char ss, int p, int q, int r, int s, int t) …

阅读全文 →

LeetCode每日一题:只出现一次的数字

2020-05-14 做题

传送门 题面挺直接的,让人第一眼看到就想用hash。但它有不让开额外的空间,所以第一时间还硬是没想出来这么做。后来看了讨论,发觉还是自己知识学的不够活啊。 这里的解法是利用位运算中的异或运算。异或具有以下特性:任意一个数与0异或还是原来的数、任意一个数与自己异或得到的一定是0。并且异或满足常规的计算率,即存在交换律。 那么对于题目给出的一串数字nums,只需要计算整个数组的异或,最后得到的就一定是那个单独的数。 ```cpp class Solution { public: int singleNumber(vector& nums) { int res = 0; for(int i : nums) res ^= i; return res; } }; ```

阅读全文 →