字符串(4题)

目录

1.最长公共前缀

2.最长回文串

3.二进制求和

4.字符串相乘


1.最长公共前缀

. - 力扣(LeetCode)

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        string ret;
        int cur = 0;
        while(1)
        {
            if(strs[0].size() == cur)return ret;
            char tmp = strs[0][cur];
            for(int i = 0; i < strs.size();i++)
            {
                if(strs[i].size() == cur)return ret;
                if(strs[i][cur] != tmp)return ret;
            }
            ret += tmp;
            cur++;
        }
        
    }
};

2.最长回文串

. - 力扣(LeetCode)

class Solution {
public:
    string longestPalindrome(string s) {
        int begin = 0;
        int len = 0;
        for(int i = 0; i < s.size(); i++)
        {
            int left = i;
            int right = i;
            while(left >=0 && right < s.size() && s[left] == s[right])
            {
                left--;
                right++;
            }
            if(right - left - 1 > len)
            {
                begin = left + 1;
                len = right - left - 1;
            } 
            left = i;
            right = i + 1;
            while(left >= 0 && right < s.size() && s[left] == s[right])
            {
                left--;
                right++;
            }
            if(right - left - 1 > len)
            {
                begin = left + 1;
                len = right - left - 1;
            }
        }  
        return s.substr(begin,len);
    }
};

3.二进制求和

. - 力扣(LeetCode)

class Solution {
public:
    string addBinary(string a, string b) {
        int sizea = a.size() - 1;
        int sizeb = b.size() - 1;
        int n = 0;
        string ret;
        int up = 0;
        while (n <= sizea || n <= sizeb)
        {
            int sa = 0;
            int sb = 0;
            if (n <= sizea)
            {
                sa = a[sizea - n] - '0';
            }
            if (n <= sizeb)
            {
                sb = b[sizeb - n] - '0';
            }
            int Add = sa + sb + up;
            up = 0;
            if (Add < 2)
            {
                ret += Add + '0';
            }
            else
            {
                ret += Add + '0' - 2;
                up = 1;
            }
            Add = 0;
            n++;
        }
        if (up)ret += up + '0';
        reverse(ret.begin(), ret.end());
        return ret;
    }
};

4.字符串相乘

. - 力扣(LeetCode)

class Solution {
public:
    string multiply(string num1, string num2) {
        string s1 = num1;
        string s2 = num2;
        int size1 = s1.size();
        int size2 = s2.size();
        reverse(s1.begin(),s1.end());
        reverse(s2.begin(),s2.end());
        vector<int> tmp(size1 + size2 - 1,0);
        for(int i = 0; i < size1; i++)
        {
            for(int j = 0; j < size2; j++)
            {
                tmp[i+j] += (s1[i]-'0')*(s2[j]-'0');
            }
        }
        string ret;
        int up = 0;
        for(int i = 0; i < tmp.size(); i++)
        {
            ret += (tmp[i]+up)%10 + '0';
            up = (tmp[i]+up)/10;
        }
        if(up)ret += up + '0';
        while(ret.back() == '0' && ret.size() > 1)
        {
            ret.pop_back();
        }
        reverse(ret.begin(),ret.end());
        return ret;
    }
};

        这题我们使用无进位相加的方法。

        先将字符串逆置,方便处理

        我们将乘出来每一位的数值先保留,等到结束后再相加。

         然后创建一个整型数组,我们所需数组长度为两个字符串长度之和-1,两个数不同位上相乘的结果可以存在这两个数下标之和对应的数组位置。

        最后我们处理前导0,由于我们先逆置过了,因此字符串ret末尾的位置是高位,将0去除即可,最后逆置回来

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java字符串面试通常涉及到String、StringBuilder和StringBuffer类的使用,以下是一些常见的问和答案: 1. String、StringBuilder和StringBuffer有什么区别? - String是不可变的字符序列,每次对String进行修改都会创建一个新的String对象,因此在频繁修改字符串时效率较低。 - StringBuilder和StringBuffer都是可变的字符序列,可以在原有对象上进行修改,因此在频繁修改字符串时效率较高。StringBuilder是非线程安全的,而StringBuffer是线程安全的。 2. String str="i"与 String str=new String("i")一样吗? - 不完全一样。String str="i"会先在常量池中查找是否存在值为"i"的字符串,如果存在则直接返回该字符串的引用;如果不存在则在常量池中创建一个新的字符串"i",并返回该字符串的引用。而String str=new String("i")则会在堆内存中创建一个新的字符串对象,并将该对象的引用赋值给str。 3. 如何将字符串转换为字节数组? - 可以使用getBytes()方法,例如: ```java String str = "hello"; byte[] bytes = str.getBytes(); ``` 4. 如何将字符串转换为字符数组? - 可以使用toCharArray()方法,例如: ```java String str = "hello"; char[] chars = str.toCharArray(); ``` 5. 如何将字符数组转换为字符串? - 可以使用String的valueOf()方法,例如: ```java char[] chars = {'h', 'e', 'l', 'l', 'o'}; String str = String.valueOf(chars); ``` 6. 如何将字符串转换为小写或大写? - 可以使用toLowerCase()和toUpperCase()方法,例如: ```java String str = "Hello"; String lowerStr = str.toLowerCase(); // 输出:hello String upperStr = str.toUpperCase(); // 输出:HELLO ``` 7. 如何将两个字符串拼接起来? - 可以使用concat()方法或"+"运算符,例如: ```java String str1 = "hello"; String str2 = "world"; String str3 = str1.concat(str2); // 输出:helloworld String str4 = str1 + str2; // 输出:helloworld ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值