zoukankan      html  css  js  c++  java
  • [编程题] 回文数问题

    回文数问题

    题目描述

    image-20200627160707816

    输入输出例如:

    image-20200627160727479

    image-20200627160733929

    样例

    image-20200627160751402

    image-20200627160800395

    方法1:对子串的首位比较,向中间进行

    思想

    我们每次拿出一个子串,然后一个头指针和一个尾指针分别指向前后,然后依次比较最后和第一个值是否是相等的,如果是相等,再比较第2个数和倒数第2个数是否相等,相等就依次向前推进,直到head>tail的时候停止。如果在这个子串的比较期间,一直进行到了结尾,即head>tail退出,那么本次子串是回文数。如果中途有不等,直接返回这个子串不是回文。

    Java代码

    import java.util.*;
    public class Main{
       public static void main(String[] args){
    
            Scanner scanner = new Scanner(System.in);
            String str = scanner.nextLine();
            int count = huiwen(str);
            System.out.println(count);
        }
    
        public static int huiwen(String str) {
            if (str == null) {
                return 0;
            }
            if (str.length() == 1) {
                return 1;
            }
    
            //记录结果
            int count = 0;
            //把字符串变为字符数组
            char[] chars = str.toCharArray();
            for (int i = 0; i < chars.length; i++) {
                //这里这样写是因为subString函数在subxxx(0,0)是取不到子串的
                for (int j = i + 1; j <= chars.length; j++) {
                    String curStr = str.substring(i, j);
                    boolean judge = judge(curStr);
                    if (judge){
                        count++;
                    }
                }
    
            }
            return count;
        }
    
        //判断
        public static boolean judge(String curStr){
            int head=0;
            int tail=curStr.length()-1;
            boolean flag = true;
            while (head<tail){
                if (curStr.charAt(head)==curStr.charAt(tail)){
                    head++;
                    tail--;
                }else {
                    return  false;
                }
            }
            return true;
        }
    }
    

    测试输出:

    image-20200627161234867

    方法2:对子串的首位比较借用栈

    思路:

    对子串入栈,出栈使用stringBuilder拼接成子串,直接比较出栈后的字符串和入栈前的字符串是否相等,如果等这个子串是回文,不等就不是回文。

    牛客-Java代码

    package newcode;
    
    import java.util.Deque;
    import java.util.LinkedList;
    import java.util.Scanner;
    
    /**
     * @author jiyongjia
     * @create 2020/6/27 - 15:22
     * @descp: 回文数问题
     * https://www.nowcoder.com/questionTerminal/9475dc0eca9248e78d3385e9986621e0?answerType=1&f=discussion
     *
     * 存在问题:不满足时间复杂度
     */
    public class P2_huiwenNum{
        public static void main(String[] args){
            long start = System.currentTimeMillis();
    
            Scanner scanner = new Scanner(System.in);
            String str = scanner.nextLine();
            int count = huiwen(str);
            System.out.println(count);
            long end = System.currentTimeMillis();
            System.out.println((end-start)/1000);
        }
    
        public static int huiwen(String str){
            if(str==null) {return 0;}
            if(str.length()==1){ return 1;}
            //借助栈
            Deque<Character> statck = new LinkedList<>();
            //记录结果
            int count=0;
            //把字符串变为字符数组
            char[] chars = str.toCharArray();
            for(int i=0;i<chars.length;i++){
                for(int j=i+1;j<=chars.length;j++){
                    String curStr = str.substring(i,j);
                    char[] cur = curStr.toCharArray();
    
                    for(char s:cur){
                        statck.push(s);
                    }
    
                    StringBuilder builder = new StringBuilder();
                    while(!statck.isEmpty()){
                        builder.append(statck.pop());
                    }
    
                    String reverseStr = builder.toString();
                    if(reverseStr.equals(curStr)){
                        count++;
                    }
                }
            }
            return count;
        }
    }
    

    测试:

    image-20200627152148371

    缺点:

    时间复杂度高

  • 相关阅读:
    Jenkins解决Host key verification failed
    jenkins+gitlab发布maven项目
    gitlab升级、汉化、修改root密码
    jenkins发布普通项目、配置自动上线自动部署
    Jenkins安装配置
    awk在企业中最常用的语句
    OpenLDAP给我的启发
    三观很正的一些话
    一次完整的http请求过程以及网络I/O模型select、epoll
    Nginx三种模式的虚拟主机(附Apache基于域名的虚拟主机)
  • 原文地址:https://www.cnblogs.com/jiyongjia/p/13198678.html
Copyright © 2011-2022 走看看