机试旧题新讲二

1、北邮2019 二进制

有一个长度为32位的二进制数X,对其进行X+1,X+3 操作,并输出。注意不能忽略前导0
输入输出格式
输入描述:
第一行,一个整数T,代表测试数据组数。
接着T行,输入32为二进制数
输出描述:
对每组测试数据,输出两行,第一行为X+1,第二行为X+3.
输入输出样例
输入样例#:
2
00000000000000000000000000000000
00000000000000000000000000000001
输出样例#:
00000000000000000000000000000001
00000000000000000000000000000011
00000000000000000000000000000010
00000000000000000000000000000100

这题一个暴力的方法就是可以先把二进制转换为十进制,分别加一加三后再转换为二进制(得分嘛,不寒掺)。这里借鉴的是大佬的思路,一个Cal函数作为加一计算,carry位作为进一位直接赋值1,相当于刚开始就加一,最后如果进位还有1,那么就在字符串首部加一。

#include<iostream>
using namespace std;
void Cal(string& str) {
    int carry = 1;
    char c;
    for (int i = str.size() - 1; i >= 0; --i) {
        c = ((str[i] - '0' + carry) % 2) + '0';
        carry = (str[i] - '0' + carry) / 2;
        str[i] = c;
    }
    if(carry)
        str = '1' + str;
}
int main()
{
    int t;
    cin >> t;
    string str;
    while (t--) {
        cin >> str;
        Cal(str);
        cout << str << endl;
        Cal(str);
        Cal(str);
        cout << str << endl;
    }
}

2、树查找

有一棵树,输出某一深度的所有节点,有则输出这些节点,无则输出EMPTY。该树是完全二叉树。
输入输出格式
输入描述:
输入有多组数据。
每组输入一个n(1<=n<=1000),然后将树中的这n个节点依次输入,再输入一个d代表深度。
输出描述:
输出该树中第d层得所有节点,节点间用空格隔开,最后一个节点后没有空格。
输入输出样例
输入样例#:
4
1 2 3 4
2
输出样例#:
2 3

输出一棵完全二叉树的某一层,完全二叉树有公式。

#include<bits/stdc++.h>
using namespace std;
int main() {
	int n;
	while (cin >> n) {
		vector<int> nums(n+1);
		for (int i = 1; i < n+1; i++) {
			cin>>nums[i];
		}
		int d;
		cin>>d;
		int start = 1 << (d-1);
		int end = 1 << d;
		if (start > n) {
			cout<<"EMPTY"<<endl;
		}
		else {
			for (int i = start; i < min(end-1,n); i++) {
				cout<<nums[i]<<" ";
			}
			cout<<nums[min(end-1, n)]<<endl;
		}
	}
	return 0;
}

3、Special数

设一个正整数既是平方数又是立方数时,称之为Special数。输入包含多组测试用例,第一行输入测试数据的组数,接着在后续每行输入n的时候,请输出1到n中包含的所有Special数的个数。
输入输出格式
输入描述:
输入包含多组测试用例
n(n<= 1000000000)
输出描述:
输入输出样例
输入样例#:
2
1
64
输出样例#:
1
2

一个数既是平方数又是立方数,那么这个数是某个数的六次方。直接暴力遍历。pow(i,6)就是i的六次方的意思。

#include<bits/stdc++.h>
using namespace std;
int main () {
	int t;
	cin>>t;
	while (t--) {
		long long n;
		cin>>n;
		int count = 0;
		vector<long long> nums;
		for (int i = 1; pow(i,6) <= n; i++) {
			count++;
		}
		cout<<count<<endl;
	}
	return 0;
}

4、打牌

牌只有1到9,手里拿着已经排好序的牌a,对方出牌b,用程序判断手中牌是否能够压过对方出牌。 规则:出牌牌型有5种 [1]一张 如4 则5…9可压过 [2]两张 如44 则55,66,77,…,99可压过 [3]三张 如444 规则如[2] [4]四张 如4444 规则如[2] [5]五张 牌型只有12345 23456 34567 45678 56789五个,后面的比前面的均大。
输入输出格式
输入描述:
输入有多组数据。
每组输入两个字符串(字符串大小不超过100)a,b。a字符串代表手中牌,b字符串代表出的牌。
输出描述:
压过输出YES 否则NO。
输入输出样例
输入样例#:
12233445566677
33
输出样例#:
YES

模拟,一至四张都是相同,从后往前遍历寻找;五章特殊点,在于要连续五章递增1的牌,且第一张大于要压的牌的第一张。

#include<bits/stdc++.h>
using namespace std;
int main() {
	string str;
	while (cin>>str) {
		string s;
		cin>>s;
		for (int i = str.size()-1; i >= 0; --i) {
			if (s.size() == 1) {
				if (str[i] > s[0]){
					cout<<"YES"<<endl;
					return 0;
				}
				else {
					cout<<"NO"<<endl;
					return 0;
				}
			}
			else if (s.size() == 2 || s.size() == 3 || s.size() == 4) {
				int count = 1;
				for (int j = str.size()-2; j>= 0; --j) {
					if (str[j] == str[j+1] && str[j] > s[0]) {
						count++;
					}
					else {
						count = 1;
					}
					if (count == s.size()){
						cout<<"YES"<<endl;
						return 0;
					}
				}
				cout<<"NO"<<endl;
				return 0;
			}
			else if (s.size() == 5) {
				int count = 1;
				for (int k = str.size()-2; k >= 0; k--) {
					if (str[k] == str[k+1]) {
						continue;
					}
					else if (str[k] == str[k+1]-1) {
						count++;
					}
					else {
						count = 1;
					}
					if (count == 5 && str[k] > s[0]) {
						cout<<"YES"<<endl;
						return 0;
					}
				}
				cout<<"NO"<<endl;
				return 0;
			}
		}
	}return 0;
}

5、复制、剪切、粘贴

有以下三种操作。
(1)COPY l r(0<=l<=r<n),n代表s串的长度。这个表示将s串从l到r的序列复制到剪贴板t里面,覆盖t字符串。
例如s为abcde t为pqr
执行COPY 1 2变为
s为abcde t为bc
(2)CUT l r(0<=l<=r<n),n代表s串的长度。这个表示将s串从l到r的序列剪切到剪贴板t里面(删除s串中的l到r的序列),覆盖t字符串。
例如s为abcde t为pqr
执行CUT 1 2变为
s为ade t为bc
(3)PASTE p(0<=p<n),n代表s串的长度。这个表示将t串插入到s串p位置的后面。t保持不变。
例如s为abcde t为pqr
执行PASTE 1 变为
s为abpqrcde
t为pqr
输入输出格式
输入描述:
多组测试数据。
首先给你s串,再给你一个m,然后给你m个操作。
输出描述:
对每个操作,输出操作后的s串。
输入输出样例
输入样例#:
复制
abcde
5
CUT 1 2
COPY 0 1
PASTE 1
PASTE 1
CUT 1 3
输出样例#:
复制
ade
ade
adade
adadade
aade

s.substr()函数,erase()函数,insert()函数。重点关注一下。

str.push_back('a')

在str结尾插入一个字符’a’

str.insert(str.begin(),'1');

在str头部插入一个字符’1’,可以选择指定位置前面插入任意字符

erase(0, len);//删除字符串中从索引位置pos开始的len个字符
使用方法 str.erase(0,3) 删除从下标0开始的3个字符 结果为"456789"

erase(s.begin()+i, s.begin()+j);//删除字符串中开始第i个到第j个的字符
使用方法 str.erase(s.begin()+2, s.end()-3) 删除从下标2开始到下标-3的所有字符 结果为"12789"

#include<bits/stdc++.h>
using namespace std;
int main() {
	string s;
	int m;
	while (cin>>s>>m) {
		string t;
		while (m--) {
			string oper;
			cin>>oper;
			if (oper == "COPY") {
				int l ,r;
				cin>>l>>r;
				t = s.substr(l, r-l+1);
				cout<<s<<endl;
			}
			else if (oper == "CUT") {
				int l, r;
				cin>>l>>r;
				t = s.substr(l, r-l+1);
				s.erase(l, r-l+1);
				cout<<s<<endl;
			}
			else if (oper == "PASTE") {
				int p;
				cin>>p;
				s.insert(p+1, t);
				cout<<s<<endl;
			}
		}
	}
	return 0;
}
		
				
  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
近年来,随着科技的快速发展,计算机相关的职业越来越受到重视。华为作为全球领先的科技公司,已经开始在兴技术上进行布局,其中华为OD是重点发力的领域之一。华为OD是一套完整的云计算解决方案,包括了云端计算、边缘计算、混合云等多个方面。随着OD的逐步完善,需要各种计算机相关专业的人才来支持其发展。为了吸引人才,华为OD机试开始逐步普及。下面是对华为OD机试2023年最题库的免费解析。 第一部分是选择题,主要是基础知识的考察。第部分是实验题,目的在于考察测试人员的实践能力。考生需要开发一款基于华为OD的应用程序,进行整个产品的设计开发和测试。在开发过程中,需要考虑如何使用OD的各项服务和资源,包括存储、计算和网络等。在测试过程中,需要进行功能测试、性能测试和安全测试等多个方面的测试。同时,还需要进行最终的用户验收测试,确保产品的质量。 对于考生来说,通过华为OD机试的考核,不仅可以验证自己在计算机方面的技术水平,同时也可以增加自己的竞争力和就业机会。作为一家技术领先的企业,华为OD的市场需求将逐渐增加。拥有OD相关技能的专业人才将变得越来越重要。因此,通过参加华为OD机试,对于计算机相关专业的考生来说,是一个难得的机会。相信在未来的职场中,拥有OD相关技能的人才将能够更好地适应市场需求,取得更高的职业成就。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值