首页 > 代码库 > 网上的一些java算法题的个人练习笔记
网上的一些java算法题的个人练习笔记
1 package com.test; 2 3 import java.io.BufferedReader; 4 import java.io.InputStreamReader; 5 import java.util.Arrays; 6 7 import org.junit.Test; 8 9 public class Test01 { 10 11 /** 12 * 键盘输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 13 * @throws Exception 14 */ 15 @Test 16 public void test01()throws Exception{ 17 18 BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in)); 19 20 String str=bfr.readLine(); 21 int countNum = 0;//统计数字的个数 22 int countChar = 0;//统计英文字母的个数 23 int countSpace = 0;//统计空格的个数 24 int countOthers = 0;//统计其它字符的个数 25 26 for(int i=0; i < str.length();i++){ 27 char s = str.charAt(i); 28 29 if(s > ‘0‘ && s < ‘9‘){ 30 countNum++; 31 }else if( (s > ‘a‘ && s < ‘z‘) || (s > ‘A‘ && s < ‘Z‘)){ 32 countChar++; 33 }else if(s == ‘ ‘){ 34 countSpace++; 35 }else{ 36 countOthers++; 37 } 38 } 39 System.out.println("数字个数:"+countNum); 40 System.out.println("英文字母个数:"+countChar); 41 System.out.println("空格个数:"+countSpace); 42 System.out.println("其他字符个数:"+countOthers); 43 44 } 45 46 /** 47 * 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。 48 */ 49 @Test 50 public void test02() throws Exception{ 51 System.out.println("请输入要叠加的数,大于0小于10"); 52 BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in)); 53 System.out.println("请输入需要相加的个数,大于0"); 54 BufferedReader bfr1 = new BufferedReader(new InputStreamReader(System.in)); 55 56 int num = Integer.parseInt(bfr.readLine()); 57 int total = Integer.parseInt(bfr1.readLine()); 58 int b = (int)nums(num , total); 59 System.out.println("result is :"+b); 60 } 61 62 public double nums(int num,int total){ 63 double result = 0; 64 double a = 0; 65 66 for(int i = 0 ; i < total ; i++){ 67 68 a = num*(Math.pow(10, i))+a; 69 result += a; 70 } 71 return result; 72 } 73 74 /** 75 * 一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.编程 找出1000以内的所有完数。 76 * 答案:6,28是完数 77 */ 78 @Test 79 public void test03() throws Exception{ 80 System.out.println("请输入X以内的完数,不包括X:"); 81 BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in)); 82 83 int num = Integer.parseInt(bfr.readLine()); 84 //先获得一个数所有的因子 85 for(int i = 1; i < num ; i++){ 86 int total = 0; 87 for(int j = 1 ; j < i ; j++){ 88 if(i % j == 0){ 89 total += j; 90 } 91 } 92 if(total == i){ 93 System.out.println("数"+i+"是完数"); 94 } 95 } 96 } 97 /*** 98 * 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高? 99 * @throws Exception100 */101 @Test102 public void test04() throws Exception{103 104 double higth10 = 0; //计算第10次的反弹高度105 double total10 = 0; //计算10次经过的米数106 //int num = 0; //下落的次数107 //100/2 100/2/2 100/2/2/2108 for(int i= 1 ; i < 10 ; i++){109 110 double a =100/(Math.pow(2, i-1))+100/(Math.pow(2, i));111 total10 += a;112 113 if(i == 9){114 higth10 = 100/(Math.pow(2, i+1));115 }116 }117 118 System.out.println("第10次落地时,共经过"+total10+"米,第10次反弹"+higth10+"米");119 120 }121 /**122 * 猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉了一半,123 * 又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩一个桃子了。求第一天共摘了多少桃子。 124 * @throws Exception125 */126 @Test127 public void test05() throws Exception{128 int total = 1; //记录猴子摘下的桃子总数129 //x/2+1 (x-(x/2+1))+1 130 //1 (1+1)*2 (4+1)*2131 for(int i =2 ; i <= 10; i++){132 total = (total+1)*2;133 } 134 System.out.println("猴子第一天摘的总的桃子数是:"+total+"个");135 }136 137 /**138 * 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?139 * @throws Exception140 */141 @Test142 public void test06() throws Exception{143 int[] nums = {1,2,3,4}; //数组保存所有的数144 for(int i = 0 ; i < 4 ;i++){ //循环获得百位数145 int num3 = nums[i];146 for(int j =0 ; j < 4 ; j++){//循环获得十位数147 148 int num2 = nums[j];149 if(num3 == num2){150 continue;151 }else{152 for(int k = 0 ; k < 4;k++){ //循环获得个位数153 int num1 = nums[k];154 if(num1 == num2 || num1 == num3){155 continue;156 }else{157 System.out.println(num3+""+num2+""+num1);158 }159 }160 } 161 }162 }163 }164 165 /**166 * 题目:判断101-200之间有多少个素数,并输出所有素数。167 * @throws Exception168 */169 @Test170 public void test07() throws Exception{171 //素数,除了1和本身之外不能被整除的数172 //注意:return是跳出所有的循环,break是跳出当前的循环173 for(int i = 101;i < 201 ; i++ ){174 boolean isSuShu = true;175 for(int j = 2 ; j < i ; j++){176 if(i%j == 0){177 isSuShu = false;178 break;179 }180 }181 182 if(isSuShu){183 System.out.println("素数:"+i);184 }185 }186 }187 188 /**189 * 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?190 * 答案:156191 * @throws Exception192 */193 @Test194 public void test08() throws Exception{195 196 //x+100 x+100+168197 198 for(int i = 0 ; i < 100000 ; i++){199 int a = i + 100;200 double value =http://www.mamicode.com/ Math.sqrt(a);201 String origin = String.valueOf(value);202 String[] values= origin.split("\\.");203 204 for(int j = 0 ; j < values.length ; j++){205 if(values[j].equals("0")){206 207 for(int m = 0 ; m < 100000 ; m++){208 int b = i + 168;209 double value1 = Math.sqrt(b);210 String origin1 = String.valueOf(value1);211 String[] values1= origin1.split("\\.");212 213 for(int n = 0 ; n < values1.length ; n++){214 if(values1[j].equals("0")){215 System.out.println("这个数就是:"+i);216 return;217 }218 }219 }220 }221 } 222 }223 }224 225 /**226 * 输入某年某月某日,判断这一天是这一年的第几天?227 * @throws Exception228 */229 @Test230 public void test09() throws Exception{231 System.out.println("输入某年某月某日,格式如:2014-07-15");232 BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));233 234 String time = bfr.readLine();235 String[] times = time.split("-");236 int year = 0;237 int month = 0;238 int day = 0;239 for(int i = 0 ; i < times.length ; i++){240 year = Integer.parseInt(times[0]);241 month = Integer.parseInt(times[1]);242 day = Integer.parseInt(times[2]);243 }244 //思路,判断是否是闰年,是:366天,不是:365天245 //闰年的条件: 246 //①、普通年能被4整除的为闰年。(如2004年就是闰年,1901年不是闰年) 247 //②、世纪年能被400整除而不能被3200整除的为闰年。(如2000年是闰年,3200年不是闰年)248 //③、对于数值很大的年份能整除3200,但同时又能整除172800则又是闰年.(如172800年是闰年,8640249 250 boolean isRun = false ; //isRun是否是闰年,默认不是251 if(year % 4 == 0){//能被四整除,有可能是闰年252 253 if(year % 400 == 0 && year % 3200 == 0){254 isRun = false;255 }else if(year % 3200 ==0 && year % 172800 != 0){256 isRun = false;257 }else{258 isRun = true;259 }260 }else{261 isRun = false;262 }263 264 if(isRun){//366天265 266 switch(month){267 case 1:268 System.out.println("这一天是这一年的第"+day+"天");269 break;270 case 2:271 System.out.println("这一天是这一年的第"+(31 + day)+"天");272 break;273 case 3:274 System.out.println("这一天是这一年的第"+(60 + day)+"天");275 break;276 case 4:277 System.out.println("这一天是这一年的第"+(91 + day)+"天");278 break;279 case 5:280 System.out.println("这一天是这一年的第"+(121 + day)+"天");281 break;282 case 6:283 System.out.println("这一天是这一年的第"+(152 + day)+"天");284 break;285 case 7:286 System.out.println("这一天是这一年的第"+(182 + day)+"天");287 break;288 case 8:289 System.out.println("这一天是这一年的第"+(213 + day)+"天");290 break;291 case 9:292 System.out.println("这一天是这一年的第"+(244 + day)+"天");293 break;294 case 10:295 System.out.println("这一天是这一年的第"+(274 + day)+"天");296 break;297 case 11:298 System.out.println("这一天是这一年的第"+(305 + day)+"天");299 break;300 case 12:301 System.out.println("这一天是这一年的第"+(335 + day)+"天");302 break;303 }304 305 }else{//365天306 switch(month){307 case 1:308 System.out.println("这一天是这一年的第"+day+"天");309 break;310 case 2:311 System.out.println("这一天是这一年的第"+(31 + day)+"天");312 break;313 case 3:314 System.out.println("这一天是这一年的第"+(59 + day)+"天");315 break;316 case 4:317 System.out.println("这一天是这一年的第"+(90 + day)+"天");318 break;319 case 5:320 System.out.println("这一天是这一年的第"+(120 + day)+"天");321 break;322 case 6:323 System.out.println("这一天是这一年的第"+(151 + day)+"天");324 break;325 case 7:326 System.out.println("这一天是这一年的第"+(181 + day)+"天");327 break;328 case 8:329 System.out.println("这一天是这一年的第"+(212 + day)+"天");330 break;331 case 9:332 System.out.println("这一天是这一年的第"+(243 + day)+"天");333 break;334 case 10:335 System.out.println("这一天是这一年的第"+(273 + day)+"天");336 break;337 case 11:338 System.out.println("这一天是这一年的第"+(304 + day)+"天");339 break;340 case 12:341 System.out.println("这一天是这一年的第"+(334 + day)+"天");342 break;343 }344 }345 }346 /**347 * 输入三个整数x,y,z,请把这三个数由小到大输出。348 * @throws Exception349 */350 @Test351 public void test10() throws Exception{352 System.out.println("请输入第一个整数,回车结束!");353 BufferedReader bfr1 = new BufferedReader(new InputStreamReader(System.in));354 355 System.out.println("请输入第二个整数,回车结束!");356 BufferedReader bfr2 = new BufferedReader(new InputStreamReader(System.in));357 358 System.out.println("请输入第三个整数,回车结束!");359 BufferedReader bfr3 = new BufferedReader(new InputStreamReader(System.in));360 361 int num1 = Integer.parseInt(bfr1.readLine());362 int num2 = Integer.parseInt(bfr2.readLine());363 int num3 = Integer.parseInt(bfr3.readLine());364 365 int[] nums = new int[5];366 nums[0] = num1;367 nums[1] = num2;368 nums[2] = num3;369 nums[3] = 1;370 nums[4] = 6;371 //冒泡排序法:思路是相邻两个进行比较,依次向后一位移动,有顺序改变的需要调换位置,重新赋值372 for(int i = 0 ; i < nums.length ; i++){ 373 for(int j = i+1 ; j < nums.length ; j++){374 if(nums[i] > nums[j]){ //i 大于 j ,先把i值用tem临时变量保存,再将j的值给i,最后将tem的值给j,即可实现i和j的对换375 int tem = nums[i];376 nums[i] = nums[j];377 nums[j] = tem;378 }379 }380 }381 }382 383 @Test384 public void test11() throws Exception{385 int[] array=new int[]{44,213,134,11,77,78,23,43}; 386 QuickSort(array, 0, array.length-1); 387 for(int i=0;i<array.length;i++) 388 { 389 System.out.println((i+1)+"th:"+array[i]); 390 } 391 }392 393 public void QuickSort(int[] array,int start,int end){ 394 if(start<end) 395 { 396 int key=array[start];//初始化保存基元 397 int i=start,j;//初始化i,j 398 for(j=start+1;j<=end;j++) {399 400 if(array[j]<key)//如果此处元素小于基元,则把此元素和i+1处元素交换,并将i加1,如大于或等于基元则继续循环 401 { 402 int temp=array[j]; 403 array[j]=array[i+1]; 404 array[i+1]=temp; 405 i++; 406 } 407 408 } 409 array[start]=array[i];//交换i处元素和基元 410 array[i]=key; 411 QuickSort(array, start, i-1);//递归调用 412 QuickSort(array, i+1, end); 413 414 } 415 } 416 417 /**418 * 递归方法sum,求1+2+...+100 的求和419 * @throws Exception420 */421 @Test422 public void test12() throws Exception{423 System.out.println(Sum(100));424 }425 426 public int Sum(int num){427 428 if(num > 0){429 return num + Sum(num-1);430 }else{ 431 return 0;432 }433 434 }435 /**436 * 递归方法sum,求1*2*...*6 的求和437 * @throws Exception438 */439 @Test440 public void test13(){441 442 System.out.println(test13_1(6));443 444 }445 446 public static int test13_1(int n) { 447 if (1 == n) 448 return 1; 449 else 450 return n*test13_1(n-1); 451 } 452 453 /**454 * 递归方法约数,求两个数的最大公约数 ,用两个数的绝对值与这两个数较小的那个一直比较,直到相等为止。455 */456 @Test457 public void test14(){458 459 System.out.println(ZuiDaGongYueShu(20,30));460 461 }462 463 public int ZuiDaGongYueShu(int num1 , int num2){464 if(num1 == num2){465 return num1 ;466 }else{467 468 return ZuiDaGongYueShu(JueDuiZhi(num1-num2),BiJiao(num1,num2));469 }470 }471 472 public int JueDuiZhi (int num){473 return num > 0? num : -num;474 }475 476 public int BiJiao(int num1 , int num2){477 return num1-num2> 0 ? num2 : num1;478 }479 480 481 482 }
网上的一些java算法题的个人练习笔记
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。