C++笔试的几个小问题
问题描述:
将一个字符用转换成16进制表示
代码:
string toHex(int ch) { char ch1 = ch / 0x10 + ‘0‘; if (ch1 > ‘9‘) { ch1 = ‘A‘ - 1 + (ch1 - ‘9‘); } char ch2 = ch % 0x10 + ‘0‘; if (ch2 > ‘9‘) { ch2 = ‘A‘ - 1 + (ch2 - ‘9‘); } string s({ ch1, ch2 }); return s; }
问题描述:
用宏定义求两个数中的较小值
代码:
#include <iostream> using namespace std; #define MIN(a, b) (a<b) ? a : b; int main() { int i = MIN(5, 3); cout << i << endl; return 0; }
问题描述:
定义一个函数,用于交换两个变量的值。
代码:
void swap(int &a, int &b) { int temp = a; a = b; b = temp; } int main() { int a = 5, b = 7; cout << a << " " << b << endl; swap(a, b); cout << a << " " << b << endl; return 0; }
问题描述:
求1到100之间的所有质数的和
代码:
bool isPrimeNumber(int n) { int k = n / 2; bool flag = true; if (n <= 1) return false; for (int i = 2; i <= k; i++) { if (n%i == 0) { flag = false; break; } } return flag; } int primeNumberSum() { int sum = 0; isPrimeNumber(1); for (int i = 1; i <= 100; i++) { if (isPrimeNumber(i)) { sum += i; } } return sum; }
问题描述:
有一个单向链表的结点结构如下描述,删除这个单链表(表头不含元素)中倒数第n个结点,并返回指向删除结点的指针。
解题分析:
一看到这个问题可能很多人会想到这样的解决方案(我自己一开始做也是这样想的):遍历一遍所有的元素,统计其总元素的大小size,然后再使结点指针从头指针开始往后移size-n+1,即指向要删除的元素,把该元素删除并返回该指针。没错,这是第一种解决方案,但这种方案不太好。它要遍历两遍,如果元素很多,要把所有元素从硬盘中读到内存,会则很耗时。这种方案不行,那就得另起思路,也就是下面要讲的第二种方案。
首先,单链表有一个特点:末尾结点的next值为空。利用这一特点可以判断结点是否为末尾结点,定义两个指针p1,p2,一开始都批向head,再 p2往后移n个结点,然后p1,p2一起往后移动,直到p2指向末尾结点,则p1指向的结点即为要删除的结点。执行过程如下图
代码:
struct SNode { int value; SNode *next; SNode(int v = 0) :value(v), next(nullptr) { } }; void insert(SNode *head, int v) { SNode *p = head; while(p->next != nullptr) { p = p->next; } SNode *node = new SNode(v); p->next = node; } SNode *deleteLast(SNode *head, int n) { SNode *p, *q; p = q = head; if (p == nullptr || p->next == nullptr) return nullptr; int count = 0; while (count < n && q != nullptr) { count++; q = q->next; } if (count < n) return nullptr; SNode * p2 = head; while (q->next != nullptr) { q = q->next; p2 = p; p = p->next; } p2->next = p->next; return p; } void testSNode() { SNode head; insert(&head, 1); insert(&head, 2); insert(&head, 3); insert(&head, 4); SNode *node = deleteLast(&head, 2); cout << node->value << endl; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。