day23

第一题

14. 最长公共前缀

解法一:两两比较

        如下图所示:

        将两个字符串一一比较,返回其共有的字符串部分,接着该部分和第三个字符串进行比较,最后返回所有字符串相同的部分,如果没有相同的部分,就返回空字符串;

        代码如下:

class Solution {
    public String longestCommonPrefix(String[] strs) {
        //两两比较
        String ret = strs[0];
        for(int i = 1;i < strs.length;i++){
            ret = findSame(strs[i],ret);
        }
        return ret;
    }

    public String findSame(String s1,String s2){
        int i = 0;
        while(i < Math.min(s1.length(),s2.length()) && s1.charAt(i) == s2.charAt(i)){
            i++;
        }
        return s1.substring(0,i);
    }
}

解法二:

        将字符串数组的第一个字符串作为固定位,以固定位的字符串的第一个元素开始,遍历其它字符串的第一个元素是否和固定位的同位置字符相等,如果相等,则接下来比较所有字符串的第二位元素;

        这样判断停止的条件是,当判断的位置等于最小字符串的长度,或者判断的时候有一个字符串的元素不等于固定位字符串同位置的元素;

        综上所述,代码如下:

class Solution {
    public String longestCommonPrefix(String[] strs) {
        //统一比较
        for(int i = 0;i < strs[0].length();i++){
            char t = strs[0].charAt(i);
            for(int j = 1;j< strs.length;j++){
                if(i == strs[j].length() || strs[j].charAt(i) != t){
                    return strs[0].substring(0,i);
                }
            }
        }
        return strs[0];
    }
}

第二题

5. 最长回文子串

  解法:中心扩展算法;即固定中心位置,定义两个指针,判断该位置的左右两边的指针所指的位置是否一样(即满足题目要求),如果一样,则继续两个指针向两边移动一个位置,继续判断;

        问题:关于奇数和偶数的回文串的判断问题;

奇数回文串:首先固定位置为i,其次令左右指针都指向i位置,下一步两个指针同时一左一右向外移动,即最后返回的字符串为奇数回文串;

        偶数回文串:首先固定位置为i,其次令左指针都指向i位置,右指指向i+1位置,下一步两个指针同时一左一右向外移动,即最后返回的字符串为偶数回文串;

综上所述,代码如下:

class Solution {
    public String longestPalindrome(String s) {
        int begin = 0,len = 0,n = s.length();
        for(int i = 0 ; i < n ;i++){//中间的固定点
        //奇数回文串
        int left = i,right = i;
        while(left >= 0 && right < n && s.charAt(left) == s.charAt(right)){
            left --;
            right ++;
        }
        if(right - left -1 > len){
            begin = left +1;
            len = right-left-1;
        }
        //若为偶数回文串
        left = i;
        right = i+1;
        while(left >= 0 && right < n && s.charAt(left) == s.charAt(right)){
            left --;
            right ++;
        }
        if(right - left -1 > len){
            begin = left +1;
            len = right-left-1;
        }

        }
        return s.substring(begin,begin+len);
    }
}

第三题

67. 二进制求和

解法:模拟竖式算法

        下图中a为11101011,b为10111;

        首先定义两个指针来指向每个字符串的最后一位,用数字来控制其的移动,用0来表示最左边,用字符串的长度-1来表示指向字符串的最右边;

        其次右边的位置开始进行计算,用t来表示两数相加的和;当t等于2时,我们要相左进一位,并变为0;

        同时用stringbuffer容器来存放已经计算完位数得数值;

        综上所述,代码如下:

class Solution {
    public String addBinary(String a, String b) {
        StringBuffer stringbuffer = new StringBuffer();
        int cur1 = a.length() - 1,cur2 = b.length() - 1;
        int t = 0;
        while(cur1 >= 0 || cur2 >= 0 || t!=0){
            if(cur1 >= 0) t += a.charAt(cur1--) - '0';
            if(cur2 >= 0) t += b.charAt(cur2--) - '0';
            stringbuffer.append((char)('0' + (char)(t%2)));
            t = t/2;
        }
        stringbuffer.reverse();
        return stringbuffer.toString();
    }
}

第四题

43. 字符串相乘

解法一:

        模拟竖式计算

如图两个字符串如下图所示:

两数相乘时,坐标如下图所示:

如上,我们将第一部分定义为乘法,即123x6、123x5、123x4;第二部分我们将上面这三个数进行加法;

        再次期间我们要注意123x5后面要加个0,123x4后面要加两个0,在进行加法;

        同时要注意前导0的小细节;

        同时登计算出结果的后要注意返回的结果字符串的顺序;

解法二:对解法一的优化;

步骤一:无进位相乘;

        定义数组,我们将每一个相对应位置上的两位数存放在字符数组之中,且两个字符串中位置分别为m和n的相乘得到的两位数存放在数组中的位置为【m+n】,有规律可得,该数组的长度定义为m+n-1既可以;

步骤二:进行相加;

步骤三:处理进位:

        主要是定义指针,具体步骤如上题故事;

综上所述,代码如下:

class Solution {
    public String multiply(String num1, String num2) {
        //1、准备工作
        int m = num1.length(),n = num2.length();
        char[] m1 = new StringBuffer(num1).reverse().toString().toCharArray();
        char[] n1 = new StringBuffer(num2).reverse().toString().toCharArray();
        int[] tmp = new int[m+n-1];
        //2、无进位相乘,然后相加
        for(int i = 0;i < m;i++){
            for(int j = 0;j < n;j++){
                tmp[i+j] +=(m1[i] - '0') *(n1[j] - '0');
            }
        } 
        //3、处理进位
        int cur = 0,t = 0;
        StringBuffer ret = new StringBuffer();
        while(cur < m+n-1 || t!= 0){
            if(cur < m + n -1) t+=tmp[cur++];
            ret.append((char)((char)((t%10)+'0')));
            t /= 10;
        }
        //4、处理前导0
        while(ret.length() > 1 && ret.charAt(ret.length() - 1) == '0'){
            ret.deleteCharAt(ret.length() - 1);
        }
        return ret.reverse().toString();

    }
}

ps:本次的内容就到这里了,如果对你有所帮助的话就请一键三连哦!!!

  • 10
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值