一、
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
给定函数count(int n),用于计算n以内(含n)完全数的个数。计算范围, 0 < n <= 500000
返回n以内完全数的个数。 异常情况返回-1
输入描述:
输入一个数字
输出描述:
输出完全数的个数
示例1
输入
1000
输出
3
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
int cnt = 0;
for(int i = 1; i <= n; i++) {
int sum = 0;
for(int j = 1; j < i; j++) {
if(i % j == 0) {
sum += j;
}
}
if(sum == i) {
cnt++;
}
}
System.out.println(cnt);
}
sc.close();
}
}
二、
给出一个名字,该名字有26个字符串组成,
定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。
没有任何两个字母拥有相同的“漂亮度”。
字母忽略大小写。
给出多个名字,计算每个名字最大可能的“漂亮度”。
输入描述:
整数N,后续N个名字
输出描述:
每个名称可能的最大漂亮程度
示例1
输入
2
zhangsan
lisi
输出
192
101
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//按照字母出现频率,从26往下排
while(sc.hasNext()){
int n = sc.nextInt();
String[] names = new String[n];
for(int i = 0; i < n; i++) {
names[i] = sc.next();
int sum = 0;
int[] cnt = new int[26];
int len = names[i].length();
for(int j = 0; j < len; j++) {
cnt[names[i].charAt(j)-'a']++;
}
Arrays.sort(cnt);
for(int j = 25; j >= 0; j--) {
if(cnt[j] == 0) {
break;
}
sum += cnt[j] * (j+1);
}
System.out.println(sum);
}
}
sc.close();
}
}
三、
任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,
本题目要求输出组成指定偶数的两个素数差值最小的素数对
输入描述:
输入一个偶数
输出描述:
输出两个素数
示例1
输入
20
输出
7
13
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//从该偶数的中位数往左找素数,同时判断补数是否为正数
while(sc.hasNext()){
int n = sc.nextInt();
int mid = n / 2;
int left = mid;
while(left >= 0) {
if(isPrime(left) && isPrime(n - left)) {
System.out.println(left);
System.out.println(n - left);
break;
}else {
left--;
}
}
}
sc.close();
}
private static boolean isPrime(int num) {
for(int i = 2; i <= num / 2; i++) {
if(num % i == 0) {
return false;
}
}
return true;
}
}
四、
题目描述
找出字符串中第一个只出现一次的字符
输入描述:
输入一个非空字符串
输出描述:
输出第一个只出现一次的字符,如果不存在输出-1
示例1
输入
asdfasdfo
输出
o
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//LinkedHashMap可以按照输入顺序存储
while(sc.hasNext()){
String str = sc.next();
int len = str.length();
Map<Character, Integer> map = new LinkedHashMap<>();
for(int i = 0; i < len; i++) {
char ch = str.charAt(i);
if(map.containsKey(ch)) {
map.put(ch, map.get(ch) + 1);
}else {
map.put(ch, 1);
}
}
boolean flag = true;
for(char ch : map.keySet()) {
if(map.get(ch) == 1) {
System.out.println(ch);
flag = false;
break;
}
}
if(flag) {
System.out.println(-1);
}
}
sc.close();
}
}
五、
输入n个整数,输出其中最小的k个。
输入描述:
输入说明
1 输入两个整数
2 输入一个整数数组
输出描述:
输出一个整数数组
示例1
输入
5 2
1 3 5 7 2
输出
1 2
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//排序
while(sc.hasNext()){
int n = sc.nextInt();
int k = sc.nextInt();
int[] a = new int[n];
for(int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
Arrays.sort(a);
for(int i = 0; i < k - 1; i++) {
System.out.print(a[i] + " ");
}System.out.println(a[k - 1]);
}
sc.close();
}
}
六、
编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。
但是要保证汉字不被截半个,如”我ABC”4,应该截为”我AB”,输入”我ABC汉DEF”6,应该输出为”我ABC”而不是”我ABC+汉的半个”。
输入描述:
输入待截取的字符串及长度
输出描述:
截取后的字符串
示例1
输入
我ABC汉DEF
6
输出
我ABC
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//Unicode,汉字占3个字节,字母一个字节,通常字符在256内
while(sc.hasNext()){
String str = sc.next();
int k = sc.nextInt();
StringBuffer sb = new StringBuffer();
int len = str.length();
for(int i = 0; i < len && k > 0; i++) {
if(str.charAt(i) > 256) {
k -= 3;
if(k >= 0) {
sb.append(str.charAt(i));
}
}else {
sb.append(str.charAt(i));
k--;
}
}
System.out.println(sb.toString());
}
sc.close();
}
}
七、
Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。
许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance。
要求:
给定任意两个字符串,写出一个算法计算它们的编辑距离。
输入描述:
输入两个字符串
输出描述:
得到计算结果
示例1
输入
abcdefg
abcdef
输出
1
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//编辑距离,典型的动态规划问题
while(sc.hasNext()){
String str1 = sc.next();
String str2 = sc.next();
int n1 = str1.length();
int n2 = str2.length();
int[][] dp = new int[n1 + 1][n2 + 1];
//可以通过翻滚法节约空间
for(int i = 0; i <= n1; i++) {
dp[i][0] = i;
}
for(int i = 0; i <= n2; i++) {
dp[0][i] = i;
}
for(int i = 1; i <= n1; i++) {
for(int j = 1; j <= n2; j++) {
if(str1.charAt(i - 1) == str2.charAt(j - 1)) {
dp[i][j] = dp[i - 1][j - 1];
}else {
dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);
dp[i][j] = Math.min(dp[i - 1][j - 1] + 1, dp[i][j]);
}
}
}
System.out.println(dp[n1][n2]);
}
sc.close();
}
}
七、
蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
输入描述:
输入正整数N(N不大于100)
输出描述:
输出一个N行的蛇形矩阵。
示例1
输入
5
输出
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11
public class 从左下到右上半矩阵{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
/* 从左下输出到右上
*/
while(sc.hasNext()){
int n = sc.nextInt();
int sum = n * (n + 1) / 2;
int[][] a = new int[n][n];
for(int i = 0; i < n; i++) {
a[i] = new int[n - i];
}
int i = 0, j = 0;
for(int k = 1; k <= sum;) {
while(i >= 0 && j < n) {
a[i--][j++] = k++;
}
i = j;
j = 0;
}
for(int h = 0; h < a.length; h++) {
for(int k = 0; k < a[h].length - 1; k++) {
System.out.print(a[h][k]+" ");
}System.out.println(a[h][a[h].length - 1]);
}
}
sc.close();
}
}