【2021-2022秋学期练习-2】7-1 这是2的幂么?
在类Tool中定义一个方法 isPower,要求对于形参num(num>0),判断num是不是2的幂,如果是返回true,否则返回false 在Main类中main方法中调用此方法,输入一个大于0的整数,调用isPower方法,如果是2的幂,输出yes,否则输出no 输入如果是0或者小于0的整数,输出error
输入格式:输入一个整数
输出格式:输出结果
输入样例1:115
输出样例1:1no
输入样例2:18
输出样例2:1yes
输入样例3:1-4
输出样例3:1error
思路题目可能是Java练习题,所以说类、方法什么的。。。
题意很简单,判断一个数n是不是2的幂,在纸上写下2、4、8、16等等这些数的二进制看一下
如果一个十进制数n是2的幂,那么其二进制除最高位为1,其余位均为0。根据这一点,代码复杂度为O(logn)
也可使用位运算,n&(-n)或n&(n-1),复杂度为O(1),可百度一下
知识点:十进制转二进制、两个位运算技巧
依次类推,判断一个十进制数是否是3的幂、4的幂、5的幂等等,看一看其对应的进制表示是否除最高位为1,其余位均为0即可 ...
【2021-2022秋学期练习-1】7-7 抢红包
没有人没抢过红包吧…… 这里给出N个人之间互相发红包、抢红包的记录,请你统计一下他们抢红包的收获。
输入格式:输入第一行给出一个正整数N(≤104),即参与发红包和抢红包的总人数,则这些人从1到N编号。随后N行,第i行给出编号为i的人发红包的记录,格式如下:
KN1P1⋯NKPK
其中K(0≤K≤20)是发出去的红包个数,N*i是抢到红包的人的编号,P*i(>0)是其抢到的红包金额(以分为单位)。注意:对于同一个人发出的红包,每人最多只能抢1次,不能重复抢。
输出格式:按照收入金额从高到低的递减顺序输出每个人的编号和收入金额(以元为单位,输出小数点后2位)。每个人的信息占一行,两数字间有1个空格。如果收入金额有并列,则按抢到红包的个数递减输出;如果还有并列,则按个人编号递增输出。
输入样例:1234567891011103 2 22 10 58 8 1255 1 345 3 211 5 233 7 13 8 1011 7 88002 1 1000 2 10002 4 250 10 3206 5 11 9 22 8 33 7 44 10 55 4 21 3 88002 1 23 2 ...
【2021-2022秋学期练习-1】7-6 打印沙漏
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
12345***** *** * ********
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:119 *
输出样例:123456***** *** * ********2
思路找规律即可,设上三角部分有row行(包括中间一个字符的那一行),一共有2*row-1行
则根据等差数列求和公式,上三角有(row*(1+2row-1))/2个字符,则一共有2\row*row-1个字符
根据n计算出最大的row,循环画图案就行了
知识点:没什么,逻辑思维题,这种画图案的题关键是找出图形的规律
代码123456789101112131415 ...
【2021-2022秋学期练习-1】7-5 二分查找
利用二分查找找出所给出的数在数组中的下标
输入格式:第一行输入n和m表示数组有n个数据,m表示要对m个数进行查找
输出格式:所有输出在一行完成,行末没有多余空格和多余回车。
输入样例:1235 51 2 3 4 51 2 3 4 5
输出样例:10 1 2 3 4
思路一道二分查找的模板题
查找不用多说,大部分情况为在数组中寻找某个数,最简单的方法就是遍历一遍,复杂度O(n)
二分查找要求数组有序,核心思想如下:(假设待查找数据为data)
若data大于数组中间位置的值,则data出现在数组后半部分
若data小于数组中间位置的值,则data出现在数组前半部分
依据以上规则,不断比较data和查找范围数组中间的值。二分查找复杂度为O(logn)
如此一想,可以衍生出三分、四分。。。
知识点:二分查找(很重要,这是一种思想,属于面试题常备军)
代码代码为递归形式,初学便于理解,其实迭代使用的更多。该题解复杂度为O(mlogn)
1234567891011121314151617181920212223242526272829303132333435363738394041#inc ...
【2021-2022秋学期练习-1】7-4 输出GPLT
给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT的顺序打印,直到所有字符都被输出。
输入格式:输入在一行中给出一个长度不超过10000的、仅由英文字母构成的非空字符串。
输出格式:在一行中按题目要求输出排序后的字符串。题目保证输出非空。
输入样例:1pcTclnGloRgLrtLhgljkLhGFauPewSKgt
输出样例:1GPLTGPLTGLTGLGLL
思路记录四种(大小写都算)字符的出现次数,然后用这些字符按顺序拼凑出GPLT即可,具体看代码
知识点:其实没什么,开拓下思维,可以看看switch的一种用法
代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061#include <iostream>us ...
【2021-2022秋学期练习-1】7-3 两个有序序列的中位数
已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A0,A1,⋯,A*N−1的中位数指*A(N−1)/2的值,即第⌊(N+1)/2⌋个数(A0为第1个数)。
输入格式:输入分三行。第一行给出序列的公共长度N(0<N≤100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。
输出格式:在一行中输出两个输入序列的并集序列的中位数。
输入样例1:12351 3 5 7 92 3 4 5 6
输出样例1:14
输入样例2:1236-100 -10 1 1 1 1-50 0 2 3 4 5
输出样例2:11
思路最直接的方法就是将给定的2*n个数存入数组中,对数组排序,排序复杂度为O(nlogn)
但是这样就没有利用题目所说的两个给定数组均有序的特点
我们可以将两个有序数组合并成一个仍然有序数组,然后取中间的值即可,合并两有序数组方法为:
不断取出两数组中较小的数存入新数组,直到两数组为空(具体看代码)
这样时间复杂度可以是O(n),相当于遍历一遍两个数组
知识点:两有序数组的合并
代码如下为合并方法,时间复杂度O(n ...
【2021-2022秋学期练习-1】7-2 正整数A+B
题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。
输入格式:输入在一行给出A和B,其间以空格分开。问题是A和B不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。
注意:我们把输入中出现的第1个空格认为是A和B的分隔。题目保证至少存在一个空格,并且B不是一个空字符串。
输出格式:如果输入的确是两个正整数,则按格式A + B = 和输出。如果某个输入不合要求,则在相应位置输出?,显然此时和也是?。
输入样例1:1123 456
输出样例1:1123 + 456 = 579
输入样例2:122. 18
输出样例2:1? + 18 = ?
输入样例3:1-100 blabla bla...33
输出样例3:1? + ? = ?
思路只有严格满足[1,1000]区间的正整数才是满足题目要求的
数字A与B之间用第一个空格相隔,在输入时要讲究一些
知识点:字符串与数字的相互转换、isdigit函数(感兴趣的可百度,还有很多用于判断字符是哪种类 ...
【2021-2022秋学期练习-1】7-1 个位数统计
给定一个 k 位整数 N=dk−110k−1+⋯+d1101+d0 (0≤di*≤9, *i=0,⋯,k−1, d*k−1>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 *N=100311,则有 2 个 0,3 个 1,和 1 个 3。
输入格式:每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。
输出格式:对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。
输入样例:1100311
输出样例:1230:21:33:1
思路题目说明正整数最高1000位,使用int、long等整型是无法存储的,需要string字符串
遍历字符串,在标记数组中记录各个数字的出现次数即可
知识点:字符转为数字、for-each循环(感兴趣的可百度)
代码123456789101112131415161718192021222324#include <iostream>using namespace std;int main() { string str; ...
每日分享day29-github仓库--free-programming-books
河北大学暑期程序设计训练每日知识分享-day29
每日分享—— github仓库分享- free-programming-booksgithub仓库 https://github.com/EbookFoundation/free-programming-books
free-programming-books,收录了大量免费的编程相关书籍,最早是 StackOverflow (一个程序员交流论坛)免费提供的编程书籍的克隆,后来有扩展。
也可以通过下载zip或者使用Git、SVN版本控制工具下载到本地,方便随时查看。如果有能力也可以参与其扩展,加入组织。
【2021暑期训练-5】7-2 树存储 完全二叉树的层序遍历
一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树。对于深度为 D 的,有 N 个结点的二叉树,若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点,这样的树就是完全二叉树。给定一棵完全二叉树的后序遍历,请你给出这棵树的层序遍历结果。
输入格式:输入在第一行中给出正整数 N(≤30),即树中结点个数。第二行给出后序遍历序列,为 N 个不超过 100 的正整数。同一行中所有数字都以空格分隔。
输出格式:在一行中输出该树的层序遍历序列。所有数字都以 1 个空格分隔,行首尾不得有多余空格。
输入样例:12891 71 2 34 10 15 55 18
输出样例:118 34 55 71 2 10 15 91
思路由于题目中给定了这是一个完全二叉树,所以根据题目中给出后序遍历的序列建出树,左儿子下标为 2 * i, 右儿子下标为 2 * i + 1, 然后再按顺序输出即可。
代码123456789101112131415161718192021222324252627282930#include<bits/stdc++.h>using namespa ...