for(int i = 1; i <= len; i++) { for(int j = 0; j < 10; j++) { for(int k = 0; k < 10; k++) { if(j != 4 && (j != 6 || k != 2)) dp[i][j] += dp[i - 1][k]; } } } 上面这段代码和下面这段代码为什么不等价呢: for(int i = 1; i <= len; i++) { for(int j = 0; j < 10; j++) { for(int k = 0; k < 10; k++) { if(j == 4) continue; // 排除数字 4 else if(j == 6 && k == 2) continue; // 排除62 dp[i][j] += dp[i - 1][k]; } } }
时间: 2024-04-19 18:26:06 浏览: 20
这两段代码的区别在于条件判断的逻辑。下面是对两段代码的逐行解释:
第一段代码:
1. 对于外层循环的每个 i,内层循环遍历 j 和 k。
2. 如果 j 不等于 4,并且(j 不等于 6 或者 k 不等于 2),则将 dp[i-1][k] 的值加到 dp[i][j] 上。
第二段代码:
1. 对于外层循环的每个 i,内层循环遍历 j 和 k。
2. 如果 j 等于 4,则跳过本次循环,继续下一次循环。
3. 否则,如果 j 等于 6 并且 k 等于 2,则跳过本次循环,继续下一次循环。
4. 在没有跳过的情况下,将 dp[i-1][k] 的值加到 dp[i][j] 上。
这两段代码之间的区别在于条件判断的逻辑不同。第一段代码使用了逻辑运算符来判断条件,而第二段代码使用了连续的条件判断语句。因此,当 j 等于 6 并且 k 等于 2 时,第一段代码会执行 dp[i][j] += dp[i - 1][k],而第二段代码会跳过这个操作。
所以这两段代码是不等价的。
相关问题
for(int i = 1; i <= len; i++) { for(int j = 0; j < 10; j++) { for(int k = 0; k < 10; k++) { if(j != 4 && (j != 6 || k != 2)) dp[i][j] += dp[i - 1][k]; } } } 上面这段代码和下面这段代码为什么不等价呢,第一段代码如何修改才能和第二段代码等价呢: for(int i = 1; i <= len; i++) { for(int j = 0; j < 10; j++) { for(int k = 0; k < 10; k++) { if(j == 4) continue; // 排除数字 4 else if(j == 6 && k == 2) continue; // 排除62 dp[i][j] += dp[i - 1][k]; } } }
这两段代码的区别在于条件判断的逻辑。
第一段代码中,我们使用了逻辑运算符来判断条件。具体来说,我们判断 j 是否不等于 4,并且判断 j 是否不等于 6 或者 k 是否不等于 2。只有当这两个条件都满足时,才会执行 dp[i][j] += dp[i - 1][k] 的操作。
第二段代码中,我们使用了连续的条件判断语句。首先,我们判断 j 是否等于 4,如果是,则跳过本次循环,继续下一次循环。否则,我们继续判断 j 是否等于 6 并且 k 是否等于 2,如果是,则也跳过本次循环,继续下一次循环。在没有跳过的情况下,才会执行 dp[i][j] += dp[i - 1][k] 的操作。
为了使第一段代码和第二段代码等价,可以对第一段代码进行修改如下:
```cpp
for(int i = 1; i <= len; i++) {
for(int j = 0; j < 10; j++) {
for(int k = 0; k < 10; k++) {
if(j == 4 || (j == 6 && k == 2)) continue;
dp[i][j] += dp[i - 1][k];
}
}
}
```
通过将条件判断的逻辑取反,将 `!=` 改为 `==`,再使用 `continue` 来跳过不满足条件的情况,即可使第一段代码和第二段代码等价。
vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> res; sort(nums.begin(),nums.end()); if(nums.size()<3) return res; int len=nums.size(); for(int i=0;i<len;i++){ for(int j=i+1;j<len;j++){ for(int k=j+1;k<len;k++){ if(nums[i]+nums[j]+nums[k]==0){ vector<int> tmp={nums[i],nums[j],nums[k]}; res.push_back(tmp); } } } }修改代码 使用hashmap去重
你可以使用哈希表来去重。以下是修改后的代码:
```cpp
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(), nums.end());
int len = nums.size();
for (int i = 0; i < len - 2; i++) {
if (i > 0 && nums[i] == nums[i - 1]) continue; // 去重
unordered_map<int, int> hash; // 使用哈希表记录已经遍历过的数
for (int j = i + 1; j < len; j++) {
int target = -nums[i] - nums[j];
if (hash.count(target) > 0) {
vector<int> tmp = {nums[i], nums[j], target};
res.push_back(tmp);
while (j + 1 < len && nums[j] == nums[j + 1]) j++; // 去重
}
hash[nums[j]] = j;
}
}
return res;
}
```
这样修改后的代码会使用哈希表来记录已经遍历过的数,以避免重复计算相同的组合。同时,也添加了一些额外的条件来进行去重操作。