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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌尘(MoChen)

爱打赏的人技术成长更开哦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值