1.算法训练 Anagrams问题

问题描述
Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的。例如,“Unclear”和“Nuclear”、“Rimon”和“MinOR”都是Anagrams。编写一个程序,输入两个单词,然后判断一下,这两个单词是否是Anagrams。每一个单词的长度不会超过80个字符,而且是大小写无关的。
  输入格式:输入有两行,分别为两个单词。
  输出格式:输出只有一个字母Y或N,分别表示Yes和No。
  输入输出样例
样例输入
Unclear
Nuclear
样例输出
Y
import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input = new Scanner(System.in);String s1 = input.next();String s2 = input.next();s1 = s1.toUpperCase();s2 = s2.toUpperCase();int []f = new int[26];int []k = new int[26];if(s1.length() == s2.length()){for(int i = 0;i < s1.length();i++){f[s1.charAt(i)-65] ++;k[s2.charAt(i)-65] ++;}int j;for(j = 0;j < 26;j++){if(f[j] != k[j]){System.out.println("N");break;}}if(j == 26)System.out.println("Y");}elseSystem.out.println("N");   }}             

将两个字符串利用s1 = s1.toUpperCase();s2 = s2.toUpperCase();全部转化成大写的形式这样好做判断,如果两个字符串长度不相等,则肯定输出N;如果两个字符串长度相等,分别对应构建两个数组,每个数组有0~25个元素,使用f[s1.charAt(i)-65];k[s2.charAt(i)-65]依次对应从A到Z的出现次数,最后通过f[i]与k[i]的对比,如果数值不相等,则输出N,使用break跳出整个for循环不用再进行后续的比较;如果数值相等,那么输出Y的语句肯定不能放在for循环之内,否则会重复输出,我们只需要最后进行判断,看是否完成了所有的for循环操作,如果全部完成,此时j==26,也就是说这两个数组26个数值都对应相等,输出Y。

import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input = new Scanner(System.in);String s1 = input.next();String s2 = input.next();s1 = s1.toLowerCase();s2 = s2.toLowerCase();char []c1 = s1.toCharArray();char []c2 = s2.toCharArray();Arrays.sort(c1);Arrays.sort(c2);if(Arrays.equals(c1, c2))System.out.println("Y");elseSystem.out.println("N");}}

第二种方法占用的内存比第一种方法要大,利用toCharArray()将两个都转化为小写的字符串转化为数组,利用Arrays.sort()对数组进行排序,直接利用Arrays.equals(c1, c2)比较排序后的两个数组元素是否对应相等。

2.算法训练 前缀表达式

问题描述
编写一个程序,以字符串方式输入一个前缀表达式,然后计算它的值。输入格式为:“运算符 对象1 对象2”,其中,运算符为“+”(加法)、“-”(减法)、“*”(乘法)或“/”(除法),运算对象为不超过10的整数,它们之间用一个空格隔开。要求:对于加、减、乘、除这四种运算,分别设计相应的函数来实现。
  输入格式:输入只有一行,即一个前缀表达式字符串。
  输出格式:输出相应的计算结果(如果是除法,直接采用c语言的“/”运算符,结果为整数)。
  输入输出样例
样例输入
+ 5 2
样例输出
7
import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input = new Scanner(System.in);String []s = new String[3];for(int i = 0;i < 3;i++){s[i] = input.next();}int a = Integer.parseInt(s[1]);int b = Integer.parseInt(s[2]);switch(s[0]){case "+" :System.out.println(Add(a,b));break;case "-":System.out.println(Subtraction(a,b));break;case "*" :System.out.println(Multiply(a,b));break;case "/":System.out.println(Division(a,b));break;default:break;}}private static int Division(int a,int b) {// TODO Auto-generated method stubreturn a / b;}private static int Multiply(int a,int b) {// TODO Auto-generated method stubreturn a * b;}private static int Subtraction(int a,int b) {// TODO Auto-generated method stubreturn a - b;}private static int Add(int a,int b) {// TODO Auto-generated method stubreturn a + b;}}

在这个题目上花费的时间主要是在字符串和数组上面,在这里不能输入字符串后再利用toCharArray()的方法转化为数组,因为我们输入字符串的时候要求中间有空格,而空格占用一个数组中的元素,容易发生错误,当然也可以采用Sring.splite(" ")方法在空格处将字符串分割存储为数组,这样有点儿麻烦,而且不是很容易能想到。所以应该直接建立一个String类型的字符串数组,可以避免空格的问题,这样输入三个元素即为该数组的三个元素。

利用Integer.parseInt(s[1])将String类型转化为int整型进行下面的运算操作。

3.算法训练 2的次幂表示

问题描述
任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001。
  将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^3+2^0
  现在约定幂次用括号来表示,即a^b表示为a(b)
  此时,137可表示为:2(7)+2(3)+2(0)
  进一步:7=2^2+2+2^0 (2^1用2表示)
  3=2+2^0 
  所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)
  又如:1315=2^10+2^8+2^5+2+1
  所以1315最后可表示为:
  2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入格式
正整数(1<=n<=20000)
输出格式
符合约定的n的0,2表示(在表示中不能有空格)
样例输入
137
样例输出
2(2(2)+2+2(0))+2(2+2(0))+2(0)
样例输入
1315
样例输出
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
提示
用递归实现会比较简单,可以一边递归一边输出
import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input = new Scanner(System.in);int n = input.nextInt();fun(n);}private static void fun(int n) {// TODO Auto-generated method stubString s = Integer.toBinaryString(n);int []f = new int[s.length()];int k = 0;for(int i = 0;i < s.length();i++){if(s.charAt(i) == '1'){f[k] = s.length()-i-1;k++;}}for(int i = 0;i < k;i++){if(f[i] == 0)System.out.print("2(0)");else if(f[i] == 1)System.out.print("2");else if(f[i] == 2)System.out.print("2(2)");else if(f[i] > 2){System.out.print("2(");fun(f[i]);System.out.print(")");}if(i != k-1)System.out.print("+");}}}

构造fun()方法进行递归,先使用String s = Integer.toBinaryString(n);将十进制转化为二进制形式,构造一个数组f[k]用来存放二进制位数为1时所对应的幂次,当幂次为0时,直接输出2(0),当幂次为1时,直接输出2,当幂次为2时,直接输出2(2),当幂次大于2时,此时需要将该幂次转化成二进制数形式,重复上面的步骤,所以再次调用fun()方法。

注意“+"的添加,为避免重复输出,必须加一个条件i!=k-1,当i==k-1时,for循环完成,不需要再添加加号。

4.算法训练 排序

问题描述
编写一个程序,输入3个整数,然后程序将对这三个整数按照从大到小进行排列。
  输入格式:输入只有一行,即三个整数,中间用空格隔开。
  输出格式:输出只有一行,即排序后的结果。
  输入输出样例
样例输入
9 2 30
样例输出
30 9 2

这个排序比较简单,直接

import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input = new Scanner(System.in);int []f = new int[3];for(int i = 0;i < 3;i++)f[i] = input.nextInt();for(int i = 0;i < 3;i++){for(int j = i+1;j < 3;j++){if(f[i] < f[j]){int temp;temp = f[i];f[i] = f[j];f[j] = temp;}}}for(int i = 0;i < 3;i++){System.out.print(f[i] + " "); }}
}

这个排序比较简单,用冒泡排序就可以解决。考察for嵌套循环的使用

5.算法训练 图形显示

问题描述
编写一个程序,首先输入一个整数,例如5,然后在屏幕上显示如下的图形(5表示行数):
  * * * * *
  * * * *
  * * *
  * *
  *
import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input = new Scanner(System.in);int n = input.nextInt();for(int i = 0; i < n;i++){for(int j = n-i ;j>0;j--){System.out.print("*" + " ");}System.out.println("");}}
}

考察for嵌套循环,比较简单。

6.算法训练 最大的算式

问题描述
题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大。因为乘号和加号一共就是N-1个了,所以恰好每两个相邻数字之间都有一个符号。例如:
  N=5,K=2,5个数字分别为1、2、3、4、5,可以加成:
  1*2*(3+4+5)=24
  1*(2+3)*(4+5)=45
  (1*2+3)*(4+5)=45
  ……
输入格式
输入文件共有二行,第一行为两个有空格隔开的整数,表示N和K,其中(2<=N<=15, 0<=K<=N-1)。第二行为 N个用空格隔开的数字(每个数字在0到9之间)。
输出格式
输出文件仅一行包含一个整数,表示要求的最大的结果
样例输入
5 2
1 2 3 4 5
样例输出
120
样例说明
(1+2+3)*4*5=120
import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input = new Scanner(System.in);int n = input.nextInt();int k = input.nextInt();long []f = new long[16];for(int i = 0;i < n; i++){f[i] = input.nextInt();   }long []sum = new long[16];sum[0] = 0;for(int i = 1;i <= n;i++){sum[i] = sum[i-1]+f[i-1];}long [][]dp = new long[16][16]; for(int i = 1;i <= n;i++){dp[i][0] = sum[i];}for(int i = 2;i <= n;i++){int t = Math.min(i-1, k);for(int j = 1;j <= t;j++){for(int h = 2;h <= i;h++){long temp = sum[i]-sum[h-1];dp[i][j] = Math.max(dp[i][j], dp[h-1][j-1]*temp);}}}System.out.print(dp[n][k]);}}

采用动态规划,不用考虑括号,只从乘号来考虑,设dp[i][j]表示前i个数中有j个乘号的最大结果,sum[i]表示前i个数的总和

当乘号个数为0时,最大算式的值即为前i个数的和,所以直接令dp[i][0]=sum[i];

自顶向下计算前i个元素的算式最大值,i最少有2个,且小于等于n;

j表示前i个元素中有j个乘号,即为乘号的个数,之前乘号为0时已经讨论过了,所以直接令j=1,而乘号的个数不仅最大只能取到i-1个要小于数的数量,而且j不应该超过我们所输入的k值,即j<=k

h表示最后一个乘号的位置,应该从2开始,且最大取到i(插空),假如乘号在第h个位置,那么此时dp[i][j]就是前h-1个数有j-1个乘号的最大值乘以第h个数到j个数的和,再将之前求出的dp[i][j]比较大小,取最大值,因为h位置已经是最后一个乘号的情况,所以dp[h-1][j-1]已经表示前k-1个数j-1个乘号的最大值,直接乘以剩余的数之和就可以了。

得出状态转移方程dp[i][j] = Math.max(dp[i][j], dp[h-1][j-1]*(sum[i]-sum[h-1]));

最最重要的是我一开始设置的三个数组最大为15,编译结果为55分,将三个均改为16之后编译结果正确,一定要注意所允许的数据的范围从而确定好数组的最大长度,否则编译出错,不容易觉察出来,在这里浪费了太长时间,哎。

dp[1][0] = 1

dp[2][0] = 1+2                     dp[2][1] = 1*2 = dp[1][0]*2

dp[3][0] = 1+2+3                dp[3][1] = (1+2)*3  =dp[2][0] *3             dp[3][2] = 1*2*3 = dp[2][1]*3

dp[4][0] = 1+2+3+4           dp[4][1] = (1+2+3)*4 = dp[3][0]*4           dp[4][2] = (1+2)*3*4 = dp[3][2]*4

dp[5][0] = 1+2+3+4+5      dp[5][1] = (1+2+3+4)*5 = dp[4][0]*5       dp[5][2] = (1+2+3)*4*5 = dp[4][1]*5

7.算法训练 未名湖边的烦恼

问题描述
每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。
  每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)
输入格式
两个整数,表示m和n
输出格式
一个整数,表示队伍的排法的方案数。
样例输入
3 2
样例输出
5
数据规模和约定
m,n∈[0,18]
  问题分析
import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input = new Scanner(System.in);int m = input.nextInt();int n = input.nextInt();System.out.println(fun(m,n));}private static int fun(int m, int n) {// TODO Auto-generated method stubif(m < n)return 0;if(n == 0)return 1;elsereturn fun(m-1,n)+fun(m,n-1);}}

采用递归思想,构造fun()方法,当借的人数大于还的人数的时候,没有办法满足,当全部都是还鞋的时候就只有一种排法;除了上面两种特殊情况,正常情况下,先安排第一个排队的人,分为两种情况,一个是还鞋的,一个是借鞋的,然后再对剩下的m+n-1人再进行如上判断return fun(m-1,n)+fun(m,n-1);

8.算法训练 数字三角形

问题描述
(图3.1-1)示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路
  径,使该路径所经过的数字的总和最大。
  ●每一步可沿左斜线向下或右斜线向下走;
  ●1<三角形行数≤100;
  ●三角形中的数字为整数0,1,…99;

  .
  (图3.1-1)

输入格式
文件中首先读到的是三角形的行数。

  接下来描述整个三角形

输出格式
最大总和(整数)
样例输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出
30
import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input = new Scanner(System.in);int n = input.nextInt();int [][]f = new int[101][101];for(int i = 0;i < n;i++){for(int j = 0;j <= i;j++){f[i][j] = input.nextInt();}}for(int i = n-1;i >= 0;i--){for(int j = 0;j < i;j++){f[i-1][j] += Math.max(f[i][j], f[i][j+1]);}}System.out.println(f[0][0]);  }
}

运用了典型的动态规划的思想:从倒数第2层开始,一层一层向上遍历。倒数第2层第一个节点为2,必定会选择5,此时用2+5=7代替原来的2,同理用7+5=12代替7,4+6=10代替4,4+6=10代替4......

在这里需要注意的是:在存储二维数组的过程中,要保证j <= i的限制条件,而不应该是j<n,否则其余未输入的部分,默认为0值,虽然编译成功,但不会输出任何的结果。

9.算法训练 Cowboys

问题描述
一个间不容发的时刻:n个牛仔站立于一个环中,并且每个牛仔都用左轮手枪指着他旁边的人!每个牛仔指着他顺时针或者逆时针方向上的相邻的人。正如很多西部片那样,在这一刻,绳命是入刺的不可惜……对峙的场景每秒都在变化。每秒钟牛仔们都会分析局势,当一对相邻的牛仔发现他们正在互指的时候,就会转过身。一秒内每对这样的牛仔都会转身。所有的转身都同时在一瞬间发生。我们用字母来表示牛仔所指的方向。“A”表示顺时针方向,“B”表示逆时针方向。如此,一个仅含“A”“B”的字符串便用来表示这个由牛仔构成的环。这是由第一个指着顺时针方向的牛仔做出的记录。例如,牛仔环“ABBBABBBA”在一秒后会变成“BABBBABBA”;而牛仔环“BABBA”会变成“ABABB”。 这幅图说明了“BABBA”怎么变成“ABABB” 一秒过去了,现在用字符串s来表示牛仔们的排列。你的任务是求出一秒前有多少种可能的排列。如果某个排列中一个牛仔指向顺时针,而在另一个排列中他指向逆时针,那么这两个排列就是不同的。
输入格式
输入数据包括一个字符串s,它只含有“A”和“B”。
输出格式
输出你求出来的一秒前的可能排列数。
数据规模和约定
s的长度为3到100(包含3和100)
样例输入
BABBBABBA
样例输出
2
样例输入
ABABB
样例输出
2

10.算法训练 P1103

编程实现两个复数的运算。设有两个复数 和 ,则他们的运算公式为:

  要求:(1)定义一个结构体类型来描述复数。
  (2)复数之间的加法、减法、乘法和除法分别用不用的函数来实现。
  (3)必须使用结构体指针的方法把函数的计算结果返回。
  说明:用户输入:运算符号(+,-,*,/) a b c d.
  输出:a+bi,输出时不管a,b是小于0或等于0都按该格式输出,输出时a,b都保留两位。

输入:
  - 2.5 3.6 1.5 4.9
输出:

  1.00+-1.30i

蓝桥杯 算法训练(2)相关推荐

  1. 蓝桥杯 算法训练 幸运的店家

    蓝桥杯 算法训练 幸运的店家 题目描述 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 炫炫开了一家商店,卖的货只有一个,XXX,XXX卖N元钱.有趣的是,世界上只有面值为3的幂的纸 ...

  2. 蓝桥杯 算法训练 Beaver's Calculator

    蓝桥杯 算法训练 Beaver's Calculator 问题描述 从万能词典来的聪明的海狸已经使我们惊讶了一次.他开发了一种新的计算器,他将此命名为"Beaver's Calculator ...

  3. 蓝桥杯 算法训练 印章

    蓝桥杯 算法训练 印章 共有n种图案的印章,每种图案的出现概率相同.小A买了m张印章,求小A集齐n种印章的概率. 输入输出: 一行两个正整数n和m 一个实数P表示答案,保留4位小数. 样例: 2 3 ...

  4. 蓝桥杯算法训练-24点(Python)

    问题描述 24点游戏是一个非常有意思的游戏,很流行,玩法很简单:给你4张牌,每张牌上有数字(其中A代表1,J代表11,Q代表12,K代表13),你可以利用数学中的加.减.乘.除以及括号想办法得到24, ...

  5. 蓝桥杯——算法训练——数字三角形

    蓝桥杯--算法训练--数字三角形 这道题不难,但是比较典型,可以作为动态规划(dp)的入门篇,属于线性dp(LIS,LCS和数字三角形都是此类题型). ------------------------ ...

  6. 蓝桥杯算法训练-强力党逗志芃

    持续更新蓝桥杯算法训练题解,有兴趣可以关注一波呀 题目 逗志芃励志要成为强力党,所以他将身上所以的技能点都洗掉了重新学技能.现在我们可以了解到,每个技能都有一个前提技能,只有学完了前提技能才能学习当前 ...

  7. 蓝桥杯 算法训练 逗志芃的危机

    蓝桥杯 算法训练 逗志芃的危机 题目描述 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 逗志芃又一次面临了危机.逗志芃的妹子是个聪明绝顶的人,相比之下逗志芃就很菜了.现在她妹子要和 ...

  8. 蓝桥杯算法训练-过河马

    蓝桥杯算法训练题解有兴趣的可以支持下. 题目 问题描述 在那个过河卒逃过了马的控制以超级超级多的走法走到了终点之后,这匹马表示它不开心了-- 于是,终于有一天,它也过河了! 由于过河马积累了许多的怨念 ...

  9. 蓝桥杯——算法训练——进击的青蛙

    问题描述 青蛙X正准备跳过一座桥,这座桥被划分为N段,记青蛙所在的起始点为0,桥的末端为N.桥上的一些点有一些石子,这些点是无法跳上去的.青蛙每次跳跃能向前跳跃+1,+2,+3段,现在请你算出跳到末端 ...

  10. 蓝桥杯算法训练合集十三 1.P06022.P07033.逗志芃的危机4.唯一的小可爱5.JOE的矩阵

    目录 1.P0602 2.P0703 3.逗志芃的危机 4.唯一的傻子 5.JOE的矩阵 1.P0602 问题描述 编写一个程序,输入一个4位的自然数,将组成该数的各位数字重新排列,形成一个最大数和一 ...

最新文章

  1. vs连接mysql建一个表并增删查改_VS连接SQL Server数据库,增删改查详细教程(C#代码)...
  2. 使用startForeground让android服务前台运行
  3. PHP之提取多维数组指定列的方法
  4. 绝地求生信号枪只能在服务器吗,绝地求生信号枪怎么用?信号枪刷新点及用法详解...
  5. gis python 桌面,arc-utils-用于Esri ArcGIS桌面软件的Python实用程序-Grant Herbert
  6. opengl源码 实现无缝切换图片过场_OpenGL学习笔记(六)变换
  7. VOSviewer | (一)从零安装教程
  8. 中国移动CMPP接口
  9. 360手机助手下载|360手机助手下载
  10. linux命令 sys,用syslinux引导多个linux系统
  11. 业务流程优化的三点思考
  12. 2013房价必然拉开大崩溃的序幕
  13. Windows10下的FPN_TensorFlow复现
  14. 利用 Matlab Simulink 平台搭建双馈风力发电机在电网中的模型
  15. 校园IPTV数字电视教学直播系统方案-淮安生态文旅区实验小学
  16. 论如何进行培养独立解决问题的能力
  17. ubuntu安装nginx安装依赖报错Unable to locate package zlib
  18. android_基础_Edittext的setSelection属性
  19. Windows Phone 7芒果更新
  20. word转pdf时图片错误的解决办法(转)

热门文章

  1. load 和 loads的区别
  2. 用switch排两个数大小C语言,关于C语言Switch语句,先学这些技巧够不够?
  3. 安装Ubuntu13.10 必做的事情 - Saucy Salamander(活泼的蝾螈)
  4. 【电气专业知识问答】问:调节器用TV熔丝熔断后的现象是什么?如何分析与处理?
  5. 无线倾角报警仪 NB-lot和lora无线倾角仪隧道监测预警
  6. 华为鸿蒙智慧屏测评,华为智慧屏SE系列评测:从用上到爱上 就是一“眼”之间...
  7. 2020.11.28-29全国高校大数据专业教学研讨与教师培训会议
  8. 【自然语言处理(NLP)】基于SQuAD的机器阅读理解
  9. 【每日一题】美国节日(基姆拉尔森公式、蔡勒公式)
  10. 针对某网站的SEO评测报告