C++笔试的几个小问题

2014-11-24 09:23:34 · 作者: · 浏览: 0


问题描述:

将一个字符用转换成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 
  
   
using namespace std;
#define MIN(a, b)  (a
   
    

问题描述:

定义一个函数,用于交换两个变量的值。

代码:

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指向的结点即为要删除的结点。执行过程如下图

\

代码:< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvcD4KPHByZSBjbGFzcz0="brush:java;">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; }