字符串高频面试题。

(一)

题目:把一个01(只包含0和1的串)串进行排序。  可以交换任意两个位置,求最少交换的次数。

方法:仿造快速排序里面的partition的过程。。。最左边的0和1是没有意义的,从左到右扫到第一个1,从右到左扫到第一个0,然后交换,然后继续扫下去,就ok啦。。

代码:

#include <iostream>
#include <string>

#define MAXN 1000

using namespace std;

int main(int argc, const char * argv[]) {
    int a[MAXN];
    int n;
    cin >> n;
    for(int i = 0; i < n; ++i) cin >> a[i];
    int answer = 0;
    for(int i = 0, j = n - 1; i < j; ++i, --j) {
        for(; (i < j) && (a[i] == '0'); ++i);
        for(; (i < j) && (a[j] == '1'); --j);
        if(i < j) answer++;
    }
    cout << answer << endl;
    return 0;
}

(二)

题目:给定一个字符串,删除里面所有的a,并且复制里面所有的b,注意:字符串数组足够大。

方法:所有的操作都在原先的字符床上进行,在删除a的过程中记录下字符b的个数,然后在复制b的时候,为了减小复杂度,采用倒着复制的方法。

代码:

#include <iostream>
#include <cstdio>
#include <string>

#define MAXN 1000

using namespace std;

int main(int argc, const char * argv[]) {
    char str[MAXN];
    scanf("%s", str);
    int n = 0, numb = 0;
    for(int i = 0; str[i]; ++i) {
        if(str[i] != 'a') str[n++] = str[i];
        if(str[i] == 'b') numb++;
    }
    str[n] = '\0';
    int newLength = n + numb;
    str[newLength] = '\0';
    for(int i = newLength - 1, j = n - 1; j >= 0; --j) {
        str[i--] = str[j];
        if(str[j] == 'b') str[i--] = 'b';
    }
    printf("%s\n", str);
    return 0;
}


(三)

题目:给定一个字符串,里面只包含*号还有数字,把*全部放到开头。

方法(1):利用快速排序里面的partition的思想,但是这种方法会使数字的相对位置发生变化,是不稳定的

方法(2):利用前面一个题目的思想,也就是倒着复制的思想。这种方法,算法前跟算法后,数字的相对顺序是不变的,是稳定的。

方法一的代码:

    for(int i = 0, j = 0; i < n; ++i) {
        if(a[i] == '*') swap(a[j++], a[i]);
    }

方法二的代码:

    int j = n-1;
    for(int i = n-1; i >= 0; --i) {
        if(isdigit(s[i])) s[j--] = s[i];
    }
    for(; j >= 0; --j) {
        s[j] = '*';
    }

(四)

题目:单词翻转,意思就是一句英文,然后要让所有单词的顺序倒过来,第一个单词变成最后一个,然后倒数第二个变成顺数第二个。

方法:先针对整个句子,全部翻转一遍,然后再针对翻转后的句子里面的每个单词,分别翻转一次。

代码:

#include <iostream>
#include <cstdio>
#include <string>

#define MAXN 1000

using namespace std;

int main(int argc, const char * argv[]) {
    string  str;
    getline(cin, str);
    int x = 0, y = str.length() - 1;
    while(x < y) swap(str[x++], str[y--]);
    cout << str << endl;
    cout << str.length() << endl;
    for(int i = 0, j = 0; i <= str.length(); ++i) {
        while(str[j] != ' ' && str[j] != '\0') j++;
        j--;
        int n = j;
        while(i < j) swap(str[i++], str[j--]);
        i = n + 1;
        j = n + 2;
    }
    cout << str << endl;
    return 0;
}

(五)

题目:给定一个字符串,长度为n,向右移动m次,然后求移动以后的结果。

方法:不管他们的大小关系,最后的结果都是移动m%n的结果。

     移动前跟移动后是有两段的顺序是不变的,所以可以把这两段看成两个整体

  右移m位的过程就是把数组的两部分交换一下。

交换的过程:(1)逆序排列第一部分

      (2)逆序排列第二部分

      (3)再全部逆序!

代码:

#include <iostream>
#include <cstdio>
#include <string>

#define MAXN 1000

using namespace std;

void swap(char *A, int x, int y) {
    while(x < y) {
        char temp = A[x];
        A[x] = A[y];
        A[y] = temp;
        x++;
        y--;
    }
}

int main(int argc, const char * argv[]) {
    char str[MAXN];
    scanf("%s", str);
    int n, m;
    n = strlen(str);
    cin >> m;
    //向右翻转m位
    swap(str, 0, n-m-1);
    swap(str, n-m, n-1);
    swap(str, 0, n-1);
    cout << str << endl;
    return 0;
}

















<think>嗯,用户想了解Python中常见的字符串面试题。首先,我得回忆一下常见的考点。字符串在Python里是基础但重要的类型,面试题通常涉及基本操作、特性以及算法应用。 首先想到的是字符串的不可性。这个点经常被考到,比如修改字符串中的某个字符,或者拼接字符串的效率问题。需要解释为什么字符串不可,以及这样设计的优缺点。例如,使用加号拼接字符串和join方法的区别,可能涉及到内存和性能的问题。 然后是反转字符串,这应该是一个常见的题目。可能有多种方法,比如切片[::-1],或者使用循环逆序拼接。还有递归的方法,不过可能效率不高。此外,要考虑Unicode字符的情况,比如处理包含多字节字符的字符串,比如emoji或者中文,这时候反转会不会出问题? 接下来是字符串的常用方法,比如split()、strip()、replace()、find()、startswith()、endswith()等。这些方法在面试中可能会被问到具体用法或者应用场景。比如如何去除字符串两边的空格,如何分割字符串,替换子串等等。 字符串的格式化也是一个考点,包括旧式的%格式化,str.format()方法,以及Python3.6引入的f-string。需要比较它们的优缺点,比如f-string的可读性和执行效率更高。 检查字符串是否由数字构成,这个问题可能涉及到isdigit()方法,但也要注意全角数字或者其他语言中的数字字符的情况,这时候可能需要更全面的判断方法,比如尝试转换成float或者int,捕获异常来判断。 回文串的判断也是一个经典题目。回文是指正读反读都一样的字符串,比如"level"。常见的方法是将字符串反转后比较,或者用双指针法从两端向中间检查。需要注意大小写的处理,以及是否忽略空格和标点符号,不同的题目要求可能不同。 统计字符出现次数,可以用字典或者collections模块的Counter类。比如统计每个字符出现的次数,或者找出出现最多的字符。这可能需要遍历字符串,然后使用哈希表来记录频率。 字符串的排列组合问题,比如找出所有可能的排列,或者检查两个字符串是否为彼此的排列(即字符相同但顺序不同)。这可能涉及到排序后比较,或者用哈希表统计各字符的出现次数是否一致。 子串查找问题,比如实现类似str.find()的功能,或者KMP算法解决高效查找。不过在实际面试中,可能更关注暴力解法或者对内置方法的了解,以及时间复杂度分析。 字符串的编码问题,比如ASCII、Unicode、UTF-8的区别,如何处理中文字符,编码和解码的方法。可能还会问到字符串在Python2和Python3中的区别,比如Python3的str是Unicode,而bytes是字节序列。 另外,内存管理方面的问题,比如字符串驻留(interning),小字符串的缓存机制。例如,a = 'hello'和b = 'hello'是否指向同一个对象,而大字符串可能不会。这涉及到Python的优化机制。 还有,字符串和列表的转换,比如将字符串转换为列表进行修改后再转回字符串。例如,处理不可字符串时,可能需要先转成列表,修改特定位置字符,再join成字符串。 可能还有一些算法题,比如最长不重复子串、最长回文子串、字符串转换整数(atoi)等。这些题目需要更复杂的逻辑和算法设计,比如滑动窗口、动态规划等。 需要分门别类,把这些知识点整理出来,用清晰的例子说明。比如反转字符串,给出不同的实现方法,比较它们的优缺点。对于字符串方法,举几个常用的例子,说明应用场景。在检查回文时,指出可能的陷阱,比如大小写和空格的处理。 还要注意,Python中的字符串是不可的,所以每次操作都会生成新的字符串对象,这在涉及大量字符串拼接时会影响性能,这时候应该使用join方法而不是多次加号拼接。 可能还需要提到正则表达式的应用,比如用re模块进行复杂的字符串匹配和替换,这在处理复杂模式时非常有用,比如验证电子邮件格式、提取URL等。 最后,总结常见的面试题类型,帮助用户系统地复习字符串相关的知识点,并给出练习的建议,比如刷LeetCode上的相关题目,或者手动实现一些字符串操作函数来加深理解。</think>以下是一些Python中常见的字符串相关面试题及解析,按知识点分类整理: --- ### 一、基础操作与特性 1. **字符串不可性** Q: 为什么说Python字符串是不可的? A: 字符串对象创建后无法修改,任何操作(如拼接、替换)都会生成新对象。 ```python s = "hello" s[0] = 'H' # 报错:TypeError ``` 2. **拼接效率** Q: `s1 + s2` 和 `"".join([s1, s2])` 哪个更高效? A: `join()` 更高效,因为`+`会反复创建新对象,而`join()`一次性分配内存。 --- ### 二、反转字符串 1. **切片法** ```python s = "hello" reversed_s = s[::-1] # "olleh" ``` 2. **递归法** ```python def reverse_str(s): return reverse_str(s[1:]) + s[0] if s else "" ``` 3. **Unicode字符处理** 注意多字节字符(如emoji)的反转可能出错,需确保正确处理Unicode。 --- ### 三、字符串方法应用 1. **常用方法** ```python " abc ".strip() # "abc" "a,b,c".split(",") # ["a", "b", "c"] "hello".replace("l", "x") # "hexxo" ``` 2. **格式化方法** ```python name = "Alice" f_str = f"Hello {name}" # f-string(推荐) ``` --- ### 四、算法问题 1. **回文判断** ```python def is_palindrome(s): s = s.lower().replace(" ", "") return s == s[::-1] ``` 2. **最长不重复子串** **滑动窗口法**: ```python def length_of_longest_substring(s): char_map = {} left = max_len = 0 for right, c in enumerate(s): if c in char_map and char_map[c] >= left: left = char_map[c] + 1 char_map[c] = right max_len = max(max_len, right - left + 1) return max_len ``` --- ### 五、编码与内存 1. **编码问题** ```python s = "你好" bytes_s = s.encode("utf-8") # b'\xe4\xbd\xa0\xe5\xa5\xbd' ``` 2. **字符串驻留(Interning)** Python会缓存小字符串(如单单词),`a = "hello"; b = "hello"`,`a is b` 返回`True`。 --- ### 六、其他高频问题 1. **检查字符串是否为数字** ```python def is_number(s): try: float(s) return True except ValueError: return False ``` 2. **统计字符频率** ```python from collections import Counter s = "abracadabra" counter = Counter(s) print(counter) # Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1}) ``` --- ### 练习建议 - 刷题平台:LeetCode(如题目:反转字符串、有效括号、字符串转换整数等)。 - 手动实现:`split()`、`strip()`等基础方法,加深理解底层逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值