1、通过逐行读取文本文件并在适当的数据结构中对每行执行操作来解决以下问题。你的实现应该足够快,即使是包含一百万行的文件也能在几秒钟内处理完。1. 逐行读取输入,然后按相反顺序输出这些行,即最后一行输入先输出,倒数第二行输入其次输出,依此类推。2. 读取前 50 行输入,然后按相反顺序输出。再读取接下来的 50 行,然后按相反顺序输出。重复此操作,直到没有更多行可读,此时剩余的行也应按相反顺序输出。换句话说,你的输出将从第 50 行开始,然后是第 49 行,第 48 行,依此类推,直到第一行。接着是第 100 行,然后是第 99 行,依此类推,直到第 51 行,依此类推。你的代码在任何时候都不应存储超过 50 行。3. 逐行读取输入。在读取前 42 行之后的任何时候,如果某行为空(即长度为 0 的字符串),则输出 42 行之前的那一行。例如,如果第 242 行为空,则你的程序应输出第 200 行。此程序的实现应确保在任何时候存储的输入行不超过 43 行。4. 逐行读取输入,如果某行不是之前输入行的重复行,则将其输出到输出中。要特别注意,对于包含大量重复行的文件,使用的内存不应超过存储唯一行所需的内存。5. 逐行读取输入,仅当某行是之前已经读过的行时,才将其输出到输出中。(最终结果是删除每行的第一次出现。)要特别注意,对于包含大量重复行的文件,使用的内存不应超过存储唯一行所需的内存。6. 逐行读取整个输入。然后按行长度对所有行进行排序并输出,最短的行排在最前面。如果两行长度相同,则按通常的“排序顺序”确定它们的顺序。重复的行只应打印一次。7. 与上一个问题相同,只是重复的行应按其在输入中出现的次数打印相同的次数。8. 逐行读取整个输入,然后先输出偶数行(从第一行,即第 0 行开始),然后输出奇数行。9. 逐行读取整个输入,然后在输出之前随机排列这些行。明确地说:你不应修改任何行的内容。相反,应打印相同的行集合,但顺序是随机的。
- 可使用合适的数据结构,如栈、队列、集合等。
- 例如:
- 问题 1 可使用栈,
- 问题 4 和 5 可使用集合,
- 问题 6 和 7 可使用排序算法等。
2、匹配字符串是由{、}、(、)、[ 和 ] 字符组成的序列,且这些字符匹配正确。例如,“{ {()[]}}” 是匹配字符串,但 “{ {()]}” 不是,因为第二个 { 与 ] 匹配。说明如何使用栈,使得对于长度为 n 的字符串,能在 O(n) 时间内判断它是否为匹配字符串。
可按以下步骤使用栈在 O(n) 时间内判断字符串是否为匹配字符串:
- 初始化一个空栈。
- 遍历字符串中的每个字符:
- 若字符是左括号({、(、[),将其压入栈。
- 若字符是右括号(}、)、]):- 若栈为空,说明没有对应的左括号,字符串不匹配。
- 弹出栈顶元素,检查弹出的左括号与当前右括号是否匹配。若不匹配,字符串不匹配。
- 遍历结束后:
- 若栈为空,说明所有左括号都有对应的右括号,字符串匹配;
- 否则,字符串不匹配。
由于只对字符串进行一次遍历,每个字符的操作时间为常数,因此时间复杂度为 O(n)。
3、尝试重新编写 addBefore(w) 操作的代码,该操作会创建一个节点 u,并将其添加到双向链表(DLList)中节点 w 之前。测试一下,看看它是否能正常工作。
以下是实现该功能的代码示例:
class Node<T> {
T x;
Node<T> prev;
Node<T> next;
}
class DLList<T> {
int n;
Node<T> addBefore(Node<T> w, T x) {
Node<T> u = new Node<>();
u.x = x;
u.prev = w.prev;
u.next = w;
u.next.prev = u;
u.prev.next = u;
n++;
return u;
}
}
4、解释如何使用按位异或运算符 ^ 来交换两个 int 变量的值,而不使用第三个变量。
使用按位异或运算符 ^ 交换两个 int 变量 a 和 b 的值,可以通过以下三步实现:
-
a = a ^ b; -
b = a ^ b; -
a = a ^ b;
原理是异或运算的特性:
- x ^ x = 0
- x ^ 0 = x
过程解析:
- 第一步将
a和b的异或结果赋给a; - 第二步用新的
a与b异或,得到原来的a,并赋给b; - 第三步用新的
a与新的b异或,得到原来的b,并赋给a。
从而完成两个变量值的交换。

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



