b1=[1,2,3] b2=[2,3,4] b3 = [val for val in b1 if val in b2] print (b3)
时间: 2024-01-10 08:02:45 浏览: 103
这段代码的输出结果是 `[2, 3]`。
这段代码使用了列表推导式,将满足 `val` 在 `b1` 中且在 `b2` 中的元素添加到列表 `b3` 中,即 `[val for val in b1 if val in b2]`。因为 `2` 和 `3` 都同时存在于 `b1` 和 `b2` 中,所以它们被添加到了 `b3` 中,最终输出结果为 `[2, 3]`。
相关问题
public static String encode(byte[] binaryData) { if (binaryData == null) { return null; } int lengthDataBits = binaryData.length * EIGHTBIT; if (lengthDataBits == 0) { return ""; } int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP; int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP; int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets; char[] encodedData = null; encodedData = new char[numberQuartet * 4]; byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0; int encodedIndex = 0; int dataIndex = 0; for (int i = 0; i < numberTriplets; i++) { b1 = binaryData[dataIndex++]; b2 = binaryData[dataIndex++]; b3 = binaryData[dataIndex++]; l = (byte) (b2 & 0x0f); k = (byte) (b1 & 0x03); byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc); encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3]; encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f]; } // form integral number of 6-bit groups if (fewerThan24bits == EIGHTBIT) { b1 = binaryData[dataIndex]; k = (byte) (b1 & 0x03); byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4]; encodedData[encodedIndex++] = PAD; encodedData[encodedIndex++] = PAD; } else if (fewerThan24bits == SIXTEENBIT) { b1 = binaryData[dataIndex]; b2 = binaryData[dataIndex + 1]; l = (byte) (b2 & 0x0f); k = (byte) (b1 & 0x03); byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2]; encodedData[encodedIndex++] = PAD; } return new String(encodedData); }重构该方法,将其认知复杂度从18降低到允许的15。
该方法是一个将二进制数据转换为Base64编码的方法。为了将其认知复杂度从18降低到允许的15,可以考虑以下几个方面:
1. 提取公共方法:将一些重复的代码提取出来,封装成一个公共的方法,使得原方法中的代码量减少。
2. 优化变量名:将一些变量名改得更加易懂,减少代码的理解难度。
3. 简化表达式:将一些复杂的表达式简化,使得代码更加易读。
4. 减少条件分支:尽量减少条件分支的使用,可以使用位运算等技巧来实现。
下面是重构后的代码:
public static String encode(byte[] binaryData) {
if (binaryData == null) {
return null;
}
int lengthDataBits = binaryData.length * 8;
if (lengthDataBits == 0) {
return "";
}
int fewerThan24bits = lengthDataBits % 24;
int numberTriplets = lengthDataBits / 24;
int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets;
char[] encodedData = new char[numberQuartet * 4];
byte val1, val2, val3, k, l, b1, b2, b3;
int dataIndex = 0, encodedIndex = 0;
for (int i = 0; i < numberTriplets; i++) {
b1 = binaryData[dataIndex++];
b2 = binaryData[dataIndex++];
b3 = binaryData[dataIndex++];
l = (byte) (b2 & 0x0f);
k = (byte) (b1 & 0x03);
val1 = (byte) ((b1 >>> 2) & 0x3f);
val2 = (byte) (((b1 << 4) & 0x30) | ((b2 >>> 4) & 0x0f));
val3 = (byte) (((b2 << 2) & 0x3c) | ((b3 >>> 6) & 0x03));
encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
encodedData[encodedIndex++] = lookUpBase64Alphabet[val2];
encodedData[encodedIndex++] = lookUpBase64Alphabet[val3];
encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f];
}
if (fewerThan24bits == 8) {
b1 = binaryData[dataIndex];
k = (byte) (b1 & 0x03);
val1 = (byte) ((b1 >>> 2) & 0x3f);
val2 = (byte) (k << 4);
encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
encodedData[encodedIndex++] = lookUpBase64Alphabet[val2];
encodedData[encodedIndex++] = '=';
encodedData[encodedIndex++] = '=';
} else if (fewerThan24bits == 16) {
b1 = binaryData[dataIndex];
b2 = binaryData[dataIndex + 1];
l = (byte) (b2 & 0x0f);
k = (byte) (b1 & 0x03);
val1 = (byte) ((b1 >>> 2) & 0x3f);
val2 = (byte) (((b1 << 4) & 0x30) | ((b2 >>> 4) & 0x0f));
val3 = (byte) (l << 2);
encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
encodedData[encodedIndex++] = lookUpBase64Alphabet[val2];
encodedData[encodedIndex++] = lookUpBase64Alphabet[val3];
encodedData[encodedIndex++] = '=';
}
return new String(encodedData);
}
c++编程子串判断问题算法(设计) 有两个整数序列A=(a1,a2,a3……am)和B=(b1,b2,b3,……bn)将其存入两个单链表中,设计算法判断序列B是否在序列A中
在C++中,判断一个整数序列B是否包含在另一个整数序列A中,可以采用双指针法。这里是一个基本的设计思路:
1. 首先,你需要创建一个结构体或者类`Node`来表示链表中的节点,包含整数值和指向下一个节点的指针。
```cpp
struct Node {
int val;
Node* next;
};
```
2. 创建两个函数,`buildList`用于构建输入的整数序列到链表,`containsSubsequence`用于查找子序列B是否存在于A。
```cpp
// 构建链表
Node* buildList(vector<int>& nums) {
if (nums.empty()) return nullptr;
Node* head = new Node{nums[0], nullptr};
Node* tail = head;
for (int num : nums) {
tail->next = new Node{num, nullptr};
tail = tail->next;
}
return head;
}
// 判断子序列是否存在
bool containsSubsequence(Node* A, Node* B, int n) {
if (!A || !B || A->val != B->val) return false; // 检查起始值
Node* A_ptr = A;
Node* B_ptr = B;
while (n--) { // 遍历B链表
if (!A_ptr || A_ptr->val != B_ptr->val) break; // 如果A遍历完还没找到对应值,说明不存在
A_ptr = A_ptr->next;
B_ptr = B_ptr->next;
}
// 如果B遍历完了,说明找到了完整的子序列
return !B_ptr;
}
```
在这个算法中,我们首先比较两个链表的头节点,如果匹配则同时移动A和B的指针。如果不匹配,则检查A链表是否有剩余元素继续匹配。如果B链表遍历完还没有结束,那么B不在A中;反之,B就在A中。
阅读全文