每日面试题
结构体的赋值方式
①初始化,如:
struct st{
char a;
int b;
}x={'A',1};
②定义变量后按字段赋值,如:
struct st{
char a;
int b;
};
struct st x;
x.a='A';
x.b=1;
③结构体变量的赋值,如:
struct st{
char a;
int b;
};
struct st x,y;
x.a='A';
x.b=1;
y=x;
结构体位域
结构体位域是一种数据类型,它允许在一个字节中存储多个不同长度的字段。例如:
struct DeviceStatus {
unsigned int isOn : 1; // 设备是否开启,1位
unsigned int hasFault : 1; // 设备是否有故障,1位
unsigned int lowPower : 1; // 是否处于低功耗模式,1位
unsigned int reserved : 5; // 保留位,5位(用于对齐或其他目的)
};
位域的好处:
①并不需要完整的字节,节省存储空间,处理简单。
②方便利用位域把一个变量按位域分解,例如:
#include <stdio.h>
// 定义包含位域的结构体
struct BitFields {
unsigned int bit0 : 1; // 第0位
unsigned int bit1 : 1; // 第1位
unsigned int bit2 : 1; // 第2位
unsigned int bit3 : 1; // 第3位
unsigned int bit4 : 1; // 第4位
unsigned int bit5 : 1; // 第5位
unsigned int bit6 : 1; // 第6位
unsigned int bit7 : 1; // 第7位
// 可以继续定义更多位域,直到填满一个或多个整型变量的位数
};
int main() {
int originalVariable = 0b10110010; // 二进制表示,例如178(十进制)
struct BitFields bitFields;
// 将变量按位域分解并赋值给结构体的位域成员
bitFields.bit0 = (originalVariable >> 0) & 1; //右移操作使我们需要得到的位数移到最低位,并与1相与得到最低位结果
bitFields.bit1 = (originalVariable >> 1) & 1;
bitFields.bit2 = (originalVariable >> 2) & 1;
bitFields.bit3 = (originalVariable >> 3) & 1;
bitFields.bit4 = (originalVariable >> 4) & 1;
bitFields.bit5 = (originalVariable >> 5) & 1;
bitFields.bit6 = (originalVariable >> 6) & 1;
bitFields.bit7 = (originalVariable >> 7) & 1;
// 打印位域的值
printf("bit0: %u\n", bitFields.bit0);
printf("bit1: %u\n", bitFields.bit1);
printf("bit2: %u\n", bitFields.bit2);
printf("bit3: %u\n", bitFields.bit3);
printf("bit4: %u\n", bitFields.bit4);
printf("bit5: %u\n", bitFields.bit5);
printf("bit6: %u\n", bitFields.bit6);
printf("bit7: %u\n", bitFields.bit7);
return 0;
}
每日算法
回文排列
给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。
class Solution {
public:
bool canPermutePalindrome(string s) {
std::unordered_map<char, int> charCount;
int oddCount = 0;
// 统计每个字符出现的次数
for (char c : s) {
charCount[c]++; //先检索c是否存在于map中,然后对值++
}
// 检查出现奇数次的字符数量
for (const auto& pair : charCount) { //const确保了不会意外地修改这些值,使用&引用避免了在每次迭代中复制std::pair<const char, int>对象,autp让编译器自动推断类型
if (pair.second % 2 != 0) {
oddCount++;
if (oddCount > 1) {
return false; // 如果超过一个字符出现奇数次,则不是回文串的排列
}
}
}
return true; // 最多只有一个字符出现奇数次,是回文串的排列
}
};