zoukankan      html  css  js  c++  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 Exception
    100      */
    101     @Test
    102     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/2
    108         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 Exception
    125      */
    126     @Test
    127     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)*2
    131         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 Exception
    140      */
    141     @Test
    142     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 Exception
    168      */
    169     @Test
    170     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      * 答案:156
    191      * @throws Exception
    192      */
    193     @Test
    194     public void test08() throws Exception{
    195         
    196         //x+100 x+100+168
    197         
    198         for(int i = 0 ; i < 100000 ; i++){
    199             int a = i + 100;
    200             double value =  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 Exception
    228      */
    229     @Test
    230     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年是闰年,8640
    249         
    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 Exception
    349      */
    350     @Test
    351     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     @Test
    384     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 Exception
    420      */
    421     @Test
    422     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 Exception
    438      */
    439     @Test
    440     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     @Test
    457     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 }
  • 相关阅读:
    Mysql中varchar类型的猫腻!
    震惊!java中日期格式化的大坑!
    mysql数据库限制多次登录失败,限定用户重试时间
    2021年回顾与展望
    多线程循环打印abc
    2020年总结-用学习过的技术搭建一个简单的微服务框架 + 源码
    回溯算法
    PyTorch 中 weight decay 的设置
    数据结构与算法——计数排序
    数据结构与算法——堆排序
  • 原文地址:https://www.cnblogs.com/LeeDane/p/3964742.html
Copyright © 2011-2022 走看看