? ? ? ? 听一些人说平时自己多敲一敲网上的什么类似经典算法多少题多少题啊,对一些公司的笔试面试会经常碰到,我想强调一下这个所谓的碰到并不是指会碰到原题,也不一定就只是单纯的换个问法而已,而是当你做过这些练习后,并且是理解了的,在对一些笔试面试的算法题上很多都能给自己带来一个思路或者方法。如碰到某道算法题恰好可以利用之前某个算法题里解决部分问题的做法,又可以利用另外一道算法题里解决某部分问题的做法,这个是我自己有过亲身经历的。发现了这个好处之后,才有了更大的动力推动我继续去敲剩下的部分,并把敲过的拿出来分享,有些是自己写的(也就简单点的自己能单靠自己敲吧-_-!)有些是借鉴别人后修改成自己的版本(代码已经跑过的)。
? ? ? ?在上个暑假我花时间去敲了一部分,我敲的很慢,因为我不只是单纯的在跟着网上的答案敲,而是先自己稍微能理解之后,自己试着敲出来,即使大多时候最后要借鉴别人的答案才知道具体怎么做,但至少我有去思考、去理解并自己去写一遍。即使不是自己设计出来的,但也能学到别人的设计思路吧,废话不多说了,看题.....
?
?1、?题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
?
? 自己理解的思路:从2开始往后判断整数是否能够被整除,能则输出这个因数,并且整
? ? ? ? ? ? ? ? ? ?除后的整数是否能继续被整除,能则再输出。
? ? ? ? ? ? ? ? ? ?这里就是单纯的循环啦,但循环的时候顺便考虑下是否能尽量减少循
? ? ? ? ? ? ? ? ? ?环次数,这里任何一个整数除了被自己整除,最大能整除的就是自己
? ? ? ? ? ? ? ? ? ?的1/2,所以我们的循环只需要迭代到整数的1/2就行了。
?
? ??
class="java" name="code">import java.util.*; public class Pro1{ public static void main(String[] args){ System.out.print("请输入一个整数:");//输入要分解的整数 int n = new Scanner(System.in).nextInt(); fenJie(n); } //分解因数 public static void fenJie(int n){ System.out.print(n+"="); for(int i=2;i<=n/2;i++){ while((i!=n) && (n%i==0)){ System.out.print(i+"*"); n=n/i; } } System.out.print(n); } }
?
?2、题目:利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。?
? ??
? ? ?思路:对于这种判断的题,像if...else这样的虽然简单,但最好使用我们平时很少用的三元运算符,听说这
? ? ? ? ? ? ? ? ?种写法会比较受一些面试官喜欢。
?
?
import java.util.*; public class Pro2{ public static void main(String[] args){ System.out.print("请输入一个整数:"); int n = new Scanner(System.in).nextInt(); change(n); } public static void change(int n){ String str=(n>=90?"A":(n>=60?"B":"C")); System.out.print(str); } }
?
? ?3、题目:输入两个正整数m和n,求其最大公约数和最小公倍数
? ?
? 思路:1)首先我们先从最大公约数入手,因为最小公倍数可以利用最大公约数来计算。
? ? ? ? ? ? ? ?2) 最大公约数下面用的是辗转相除法:首先用较大的数除以较小的数,接着将除数
? ? ? ? ? ? ? ? ? ? ?当做被除数,上一次的余数作为除数,继续上一步操作,直到除数的值为0,此时
? ? ? ? ? ? ? ? ? ? ?被除数就是要求的最大公约数。
? ? ? ? ? ? ? ?3)最小公倍数等于俩整数乘积除以最大公约数。
?
? ?
import java.util.*; public class Pro3{ public static void main(String[] args){ Scanner scan = new Scanner(System.in); System.out.print("请输入第一个整数:"); int m = scan.nextInt(); System.out.print("请输入第二个整数:"); int n = scan.nextInt(); maxGongyue(m,n); minGongbei(m,n); } //求最大公约数 public static void maxGongyue(int m,int n){ int max = m>n?m:n; int min = m<n?m:n; while(min != 0){ int tmp = max % min; max = min; min = tmp; } System.out.println("最大公约数是:"+max); } //求最小公倍数 public static void minGongbei(int m,int n){ System.out.println("最小公倍数是:"+(m*n /maxGongyue(m,n))); } }?
?
? ?4、?题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。? ?
?
? ?思路:1)一行字符,也就是一个字符串,要判断里面的每个字符自然是要先将字符串转换成一个一个的
? ? ? ? ? ? ? ? ? ? 字符,这里采用将字符串转换成字符数组。
? ? ? ? ? ? ? ?2)对数组遍历,字符A - Z对应十进制65—90,a—z对应97—122,空格对应十进制32, 字符0—9对应十
? ? ? ? ? ? ? ? ? ? 进制48—57。
?
? ??
import java.util.*; public class Pro4{ public static void main(String[] args){ int zimu = 0,kongge = 0, shuzi = 0, other = 0; System.out.println("请输入一行字符"); String strline = new Scanner(System.in).nextLine(); char[] strChar = strline.toCharArray(); for(char c : strChar){ if((c>=65 && c<=90) || (c>=97 && c<=122)){ zimu ++; } else if(c==32){ kongge ++; } else if(c>=48 && c<=57){ shuzi ++; } else{ other ++; } } System.out.println("英文字母个数:"+zimu+",空格个数: "+kongge+",数字个数:"+shuzi+",其他字符个数:"+other); } }?
?
? ?5、题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共
? ? ? ?有5个数相加),几个数相加由键盘输入。
?
? ?
import java.util.*; public class Pro5{ public static void main(String[] args){ Scanner scan = new Scanner(System.in); System.out.print("输入一个整数作为基数:"); int a = scan.nextInt(); System.out.print("输入相加个数:"); int n = scan.nextInt(); int tmp = 0; long sum = 0; for(int i = 0; i<n;i++){ tmp = tmp * 10 +a; sum +=tmp; } System.out.println("最后结果是:"+sum); } }
?