Java程序员从笨鸟到菜鸟(三)算法笔试题
一、上台阶(京东笔试编程题)
题目:有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或者二级,要走上m级,共有多少走法?注:规定从一级到一级有0种走法。
给定一个正整数int n,请返回一个数,代表上楼的方式数。保证n小于等于100。为了防止溢出,请返回结果Mod 1000000007的值。
测试样例:3,返回:2
题目分析:测试样例,输入台阶数3,只有两种有效方式,也就是只能1,2或2,1,这样可以采用奇偶思想,两个1之间必须要有一个2。
思路1:采用递归方式(台阶数多的时候会超时)
代码实现:
public static int method(int n) {if(n > 2) return (method(n - 1) + method(n - 2)) % 1000000007;else return 1;
}
思路2:采用动态规划方法
public static int method1(int n) {int[] sum = new int[101];sum[0] = 0;sum[1] = 0;sum[2] = 1;sum[3] = 2;for (int i = 4; i <= n; i++) {sum[i] = (sum[i - 2] + sum[i - 1]) % 1000000007;}return sum[n];
}
运行结果:
二、构造回文(腾讯编程题)
题目:给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输入描述:
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述:
对于每组数据,输出一个整数,代表最少需要删除的字符个数。
输入例子:
abcda
输出例子:
2
删除部分字符使其变成回文串问题——最长公共子序列(LCS)问题
区别:
最长公共子串(Longest Common Substirng):连续
最长公共子序列(Longest Common Subsequence,LCS):不必连续
思路:反序这个字符串,求新串和原串的最大子序列,需要删除的字母个数即为原字符串的长度减去最长公共子序列。
求最长公共子序列思路:假设s1字符串的下标为n1,s2字符串的下标为n2,最长公共子序列的长度为L;分两种情况:假设s1(n1) == s2(n2),那么此时最长公共子序列的长度L(n1+1,n2+1)=L(n1,n2)+1,如果s1(n1)!=s2(n2),此时要么舍弃s1的n1字符,要么舍弃s2的n2字符,这样就从L(n1,n2+1)、L(n1+1,n2)中挑选更长的子序列为最长公共子序列。
代码实现:
// 获取应删去的长度
public static int getCount(String s) {StringBuilder s1 = new StringBuilder(s);StringBuilder s2 = new StringBuilder(s).reverse();return s.length() - LCS(s1,s2);
}
// 求最长的公共子序列(LCS)
public static int LCS(StringBuilder s1, StringBuilder s2) {int n1 = s1.length();int n2 = s2.length();int[][] mutrix = new int[n1 + 1][n2 + 1];for (int i = 0; i < n1; i++) {for (int j = 0; j < n2; j++) {if(s1.charAt(i) == s2.charAt(j)) mutrix[i + 1][j + 1] = mutrix[i][j] + 1;else mutrix[i + 1][j + 1] = Math.max(mutrix[i][j + 1], mutrix[i + 1][j]);}}return mutrix[n1][n2];
}
该编程题解决思路转载来自原文传送门
三、字符集合(华为校招)
题目:输入一个字符串,求出该字符串包含的字符集合
输入描述:每组数据输入一个字符串,字符串最大长度为100,且只包含字母,不可能为空串,区分大小写。
输出描述:每组数据一行,按字符串原有的字符顺序,输出字符集合,即重复出现并靠后的字母不输出。
输入例子:abcqweracb
输出例子:abcqwer
思路:去除输入字符串中重复的字符,最后输出剩下的字符串。使用HashMap来处理这个问题,保存不存在的字符。
代码实现:
// 输入校验,只能输入字符,正则表达式
String regex = "^[a-zA-Z]+$";
// 求字符串包含的集合
public static StringBuilder stringSet(String s) {int j = 0;StringBuilder sb = new StringBuilder();HashMap<Integer, Character> hm = new HashMap<>();for (int i = 0; i < s.length(); i++) {if(!hm.containsValue(s.charAt(i))) {j++;hm.put(j, s.charAt(i));}}for(int n: hm.keySet()) {sb.append(hm.get(n));}return sb;
}
输出结果:
四、组成无重复的三位数
输入例子:1,2,3,4
输出结果:24 个
代码实现:
private static void getNumber() {int i = 0, j = 0, k =0, n = 0;for (i = 1; i <= 4; i++) {for (j = 1; j <= 4; j++) {for (k = 1; k <= 4; k++) {if (i != j && j != k && i != k) {n += 1;Sys}}}}System.out.println("共有:" + n + "个不重复的三位数");}
输出结果:
123
124
132
134
142
143
213
214
231
234
241
243
312
314
321
324
341
342
412
413
421
423
431
432
共有:24个不重复的三位数Process finished with exit code 0
五、计算空格之后的字符串长度
代码实现:
private static int getWorldLength(String s) {return s.trim().length() - s.trim().lastIndexOf(" ") - 1;
}
输出结果:
输入的字符串: Hello world
空格后字符串的长度为:5Process finished with exit code 0
六、计算两个长整数之和
方式1:采用字符数组
/*** 求和基于字符数组* 可以使用类似小学做数学题,竖列按位相加,将整数每个位置的数字放入字符数组中,然后再相加* @param bigNumA 较大整数A* @param bigNumB 较大整数B* 时间:650ms* */private static String getResult(String bigNumA, String bigNumB) {char[] charA = new StringBuilder(bigNumA).reverse().toString().toCharArray();char[] charB = new StringBuilder(bigNumB).reverse().toString().toCharArray();
// int maxLength = charA.length > charB.length ? charA.length:charB.length;int maxLength = Math.max(charA.length, charB.length);int[] result = new int[maxLength + 1];for (int i = 0; i < result.length; i++) {int temp = result[i];if (i < charA.length) {temp += charA[i] - '0';}if (i < charB.length) {temp += charB[i] - '0';}if (temp >= 10) {temp = temp - 10;result[i + 1] = 1;}result[i] = temp;}StringBuilder sb = new StringBuilder();boolean flag = true;for (int i = result.length - 1; i >= 0; i--) {if (result[i] == 0 && flag) {continue;}flag = false;sb.append(result[i]);}return sb.toString();}
方式二:采用 Math 类的 BigInteger、BigDecimal
/*** 使用 BigInteger 类、BigDecimal 类* */private static String getTwoSum(String s1, String s2) {
// return new BigInteger(s1).add(new BigInteger(s2)).toString();return new BigDecimal(s1).add(new BigDecimal(s2)).toString();}
版权声明:欢迎转载, 转载请保留原文链接。https://mp.csdn.net/postedit/79354045
Java程序员从笨鸟到菜鸟(三)算法笔试题相关推荐
- Java程序员从笨鸟到菜鸟之(五)java开发常用类(包装,数字处理集合等)(下)...
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 写在前面:由于前天项目老师建设局的项目快到验收阶段,所以,前天晚上通宵,昨天睡了大半天, ...
- Java程序员从笨鸟到菜鸟之(一百零九)一步一步学习webservice(三)开发第一个基于XFire的webservice
在日常开发中,常用的webservice引擎主要有Axis,axis2,Xfire以及cxf(Xfire的升级版).现在只有axis2和cxf官方有更新.今天我们先以一个比较老的引擎为例.来讲诉一下w ...
- Java程序员从笨鸟到菜鸟之(一百零八)一步一步学习webservice(二)webservice基本原理
本来这第二篇打算讲解"开发第一个基于XFire的webservice"的内容来着.但是想想.开发实例只是局限于了会用的层面上.如果想真正的理解webservice还是需要挖掘其原理 ...
- Java程序员从笨鸟到菜鸟之(五)java开发常用类(包装,数字处理集合等)(下)
写在前面:由于前天项目老师建设局的项目快到验收阶段,所以,前天晚上通宵,昨天睡了大半天,下午我们宿舍聚会,所以时间有点耽误,希望大家见谅 上接: Java程序员从笨鸟到菜鸟之(四)java开发常用类( ...
- Java程序员从笨鸟到菜鸟之(一百零六)java操作office和pdf文件(四)页面列表导出cvs,excel、pdf报表.
在平常的开发中我们常常遇到不仅仅只是导出excel报表的情况.有时候也需要导出pdf或者CSV报表.其实原理都差不多.刚开始本来不打算也这篇博客介绍这个的.感觉这篇博客和前面的博客有点雷同.原理基本都 ...
- Java程序员从笨鸟到菜鸟全部博客目录
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.NET/csh624366188 欢迎关注微信账号:java那些事:csh624366188.每天一篇java相关的文章 大 ...
- Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表...
在上一篇博客中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅仅简单的读取office中的数据.尤其是在生 ...
- Java程序员从笨鸟到菜鸟之(序言)+全部链接
http://blog.csdn.net/csh624366188 大学上了一年半,接触java也一年半了,虽然中间也有其他东西的学习,但是还是以java为主路线,想想这一年半,除去前半年几乎全玩了, ...
- Java程序员由笨鸟到菜鸟 电子版书正式发布 欢迎大家下载
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 欢迎关注 ...
- java程序员从笨鸟到菜鸟_Java程序员从笨鸟到菜鸟之(十四)Html基础积累总结(上)...
[新朋友]点击标题下面(↑)蓝色字"Java那些事"关注 [老朋友]点击右上角,转发或分享本页面内容 这是我以前写的<java程序员由笨鸟到菜鸟>系列博客,每天更新一篇 ...
最新文章
- 中信银行总行信息科技部笔试面试以及最后拿offer经历
- keras-vis可视化特征
- 嵌入式环境:挂载开发板根NFS文件系统失败
- 2.4 梯度下降法-深度学习-Stanford吴恩达教授
- html数据分析表格api_Python数据分析基本库——Matplotlib(一)
- differential forms
- python和matlab矩阵运算效率_如何写出比 MATLAB 更快的矩阵运算程序?
- loadrunner中文件的操作
- 国产操作系统产业深度解析
- 快速制作index.html,介绍一个h5快速制作平台鲁班H5
- 天梯赛-愿天下有情人都是失散多年的兄妹-题解
- 逍遥模拟器怎么开启vt?
- CollabNet Subversion Edge 版本库访问规则 svn
- 亚洲杯:艾因月夜,里皮妙手导演逆转
- composer错误
- modelsim/Questasim中添加xilinx ip库,并仿真成功
- 两个软硬程度一样的鸡蛋,它们在某一层摔下会碎,有个100层的建筑,要求最多用两个鸡蛋确 定鸡蛋安全下落的临界位置,给出临界位置?如果是n层楼,m个鸡蛋,请给出确定临界位置的算法
- Java IO BIO NIO
- 抓rtmp推流地址_如何获取第三方推流地址?
- 局域网访问提示无法访问检查拼写_无法访问局域网共享(win7访问xp):请检查名称的拼写.否则网络可能有问题. 错误代码0x80004005...