诺瓦星云 2024.8.07
选择填空:
1、下列for循环的循环次数
循环内具体内容不记得了,但是知识点是
for(;;)
是一个无限循环,当满足条件的时候通过break跳出语句
for(;;){
if(k == ??){
k++;
break;
}
}
2、
int a = 5;
float b = 7.2;
float c = 3.6;
求
a + (int)((int)c + b) >> (int)((int)b + c)
简答题:
1、请你解释你对DMA的理解,并举例说明
2、可重入函数和不可重入函数
编程题:
1、最长无重复字符子串
C++
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.length() == 0){
return 0;
}
unordered_map<char, int> hashTable; // 键值存放字符,值存放下标
int maxLength = 0; // 记录最大子串长度
int curLength = 0; // 临时的子串长度
int startIndex = 0; // 起始的位置
for(int i = 0; i < s.length(); i++){
if(hashTable.find(s[i]) == hashTable.end()){ // 判断是否存在这个值,不存在返回true
curLength++; // 扩展移动窗口
hashTable[s[i]] = i; // 将记录的字符的下标存放
}
else{ // 这个字符已经出现过
if(curLength > maxLength){
maxLength = curLength; // 更新最大子串长度
}
startIndex = max(hashTable[s[i]], startIndex); // 找到重复字符出现的最后一个位置,更新移动窗口的左边界
curLength = i - startIndex;
hashTable[s[i]] = i; // 将这个字符的最后出现位置更新到当前字符位置
}
}
maxLength = maxLength > curLength ? maxLength : curLength;
return maxLength;
}
};
C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
int lengthOfLongestSubstring(char *str){
int res = 0;
int left, right = 0;
int n = strlen(str);
bool has[128]; // ASCII表一共128个字符
for(right; right < n; right++){
char c = str[right];
// 如果窗口内已经包含 c,那么再加入一个 c 会导致窗口内有重复元素
// 所以要在加入 c 之前,先移出窗口内的 c
while (has[c]) { // 窗口内有 c
has[str[left++]] = false; // 缩小窗口
}
has[c] = true; // 加入 c
int len = right - left + 1;
res = len > res ? len : res; // 更新窗口长度最大值
}
return res;
}
int main(void) {
char str[] = "abcabcbb";
int maxLength = lengthOfLongestSubstring(str);
printf("%d", maxLength);
}
2、单链表的冒泡排序,要求首先将数组转换成链表,头节点有数据,并且是交换节点而不交换数据