`
orange.lpai
  • 浏览: 92974 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

2010笔面试专栏一:字符串

阅读更多
计算机笔试和面试最常考察的就是字符串的各种操作。字符串处理是我们程序员日常工作最常遇到的问题,能够体现程序员的基本功。下面我就最近一个月以来的各种笔试和面试遇到的有关字符串处理的题目和大家分享一下:
  1、google笔试:编码实现求给定字符串(全为小写英文字母)的最小后继,如“abc”的最小后继为 “abd”,“dhz”的最小后继为“dj”。
  思路:题目比较简单,对最后一个字符+1,如果大于’z’则对前一个字符+1,如果又是大于 ’z’,重复之前步骤。所以写代码时,我们只要对字符串循环从后往前对每一个字符进行+1,直到出现+1后不超过’z’为止。如果退出循环时第一个字符大于于’z’则提示不存在,否则把退出循环的字符的后一位置为’\0’即可

  代码:
int MinNextStr(const char* src,char* &minnext)
{
    int srclen=strlen(src);
    minnext=(char*)malloc((srclen+1)*sizeof(char));
    if(minnext==NULL)
    {
        return -1;
    }
    strcpy(minnext,src);
    int i=srclen-1;
    while(i>=0)
    {
        minnext[i]++;
        if(minnext[i]<='z')
        {
            break;
        }
        i--;
    }
    if(i<0)
    {
        return 0;
    }
    else
    {
        minnext[++i]='\0';
        return 1;
    }
}

  如果把给定字符串全为小写英文字母改为大小写英文字母,则只要把:if(minnext[i]<='z')改为 if(minnext[i]<='z'&&minnext[i]>'a'||minnext[i]<='Z'),注意minnext[i]<='z'&&minnext[i]>'a'是为了防止minnext[i]为大写的情况,因为大写英文字母(A:65)比小写(a:97)的ASCII 码小,如果不加minnext[i]>'a'则minnext[i]为(’Z’+1,ASCII 码:91)也会跳出循环。
  2、中兴:编码实现字符串右移n位,如“diopHeg”右移2位为“egdiopH”
  思路1:只要把需要移动的最后n个字符保存下来,把前面剩下的全部后移n个位置,最后把开始保存好的n 个字符填充到前面n个位置。注意:n超过字符串长度的情况,所以事前先做n mod 字符串的长度。

  代码:
int RightMoveStr(char* src,int n)
{
    int len=strlen(src);
    int mov=n%len;
    char* rstr=(char*)malloc((mov+1)*sizeof(char));
    if(rstr==NULL)
    {
        return 0;
    }
    int i=0;
    while(i<mov)
    {
        rstr[i]=src[len-mov+i];
        i++;
    }
    rstr[i]='\0';
    i=len-mov-1;
    while(i>=0)
    {
        src[i+mov]=src[i];
        i--;
    }
    i=0;
    while(i<mov)
    {
        src[i]=rstr[i];
        i++;
    }
    free(rstr);
    return 1;
}  

思路2:使用字符串库函数简化编码工作,用一个新的字符串ss保存结果,先把源字符串指针s移到需要右移的子串的第一个字符的位置,如 “diopHeg”右移2位就把s移动到指向’e’,接着 strcpy(ss,s),把s所指位置赋值为’\0’,最后strcat(ss,s)。
int RightMove(char* src,char* &ssrc,int n)
{
    int len=strlen(src);
    ssrc=(char*)malloc(sizeof(char)*(len+1));
    n=n%len;
    if(ssrc==NULL)
    {
        return 0;
    }
    int i=0;
    char* s=src;
    while(i<len-n)
    {
        s++;
        i++;
    }
 
    strcpy(ssrc,s);
    *s='\0';
    strcat(ssrc,src);
    return 1;      
}

  3、新邮通:字符串反转:给定字符串“we;tonight;you;”,编码实现输出“ew;thginot;uoy;”
  思路:使用两个变量first和end分别记录当前需要反转的子串的头和尾字符的下标,每遇到’;’就把first和end之间的子串进行前后反转。

  代码:
void ReverseStr(char *src)
{
    int len=strlen(src);
    int i=0;
    int first=0;
    int end=0;
    while(i<len)
    {
        if(src[i]==';')
        {
            end=i-1;
            while(first<end)
            {
                char temp=src[first];
                src[first]=src[end];
                src[end]=temp;
                first++;
                end--;
            }
            first=i+1;
        }
        i++;
    }
}

  如果给定字符串结尾没有’;’,如“we;tonight;you”,编码实现输出“ew;thginot;uoy”,只需要修改一下代码9、10、11行:
       
if(src[i]==';'||i==len-1)
        {
            if(src[i]==';')
                end=i-1;
            else
                end=i;

  4、西艾:X86结构下,下面代码输出结果是什么?
  代码:
char str[20]="Good night";
int* p=(int*)str;
p[0]=0x61626364;
p[1]=0x31323334;
p[2]=0x41424344;
cout<<str<<endl;

  解题:考察知识点:
  (1)int的内存大小:32bit=4byte;char的内存大小:4bit=1byte;
  (2)常用字符的ASCII 码,’a’:97;’A’=65;’0’=48;
  (3)十六进制转,0x61=97;
  4)大小端模式:
所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
所谓的大端模式,是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
  而X86结构为小端模式,所以:
  p[0]=0x61626364;//97,98,99,100对应a,b,c,d,小端存在字符串str则为dcba
  p[1]=0x31323334;//同理4321
  p[2]=0x41424344;//同理DCBA
  代码输出:dcba4321DCBA
分享到:
评论
1 楼 xujinquan19 2010-12-17  
如果给定字符串结尾没有’;’,如“we;tonight;you”,编码实现输出“ew;thginot;uoy”,只需要修改一下代码9、10、11行:
        C++代码
if(src[i]==';'||i==len-1)  
        {  
            if(src[i]==';')  
                end=i-1;  
            else 
                end=i; 


/////应该是i<=len-1吧

相关推荐

    2010笔面试专栏一:字符串[借鉴].pdf

    本文将基于提供的内容,深入解析两个字符串处理问题,一个是求给定字符串的最小后继,另一个是实现字符串的右移操作。 首先,我们来看第一个问题:求给定字符串的最小后继。这个问题主要考察的是对字符编码的理解和...

    更新至2020年12月最全Java 面试全解析:核心知识点与典型面试题.pdf

    - String类面试题:从表象到原理的深入讲解,解析String不可变性,字符串常量池等问题。 - Java8新特性:时间日期模块的介绍,以及新的日期时间API如何提高代码的简洁性和效率。 - 包装类和数组:介绍包装类不...

    38 SpEL总结及常见面试题解析慕课专栏1

    1. **文字表达式**:允许直接使用字符串、数字、日期等基本类型的数据。 2. **布尔和关系运算符**:支持常见的比较操作,如等于(==)、不等于(!=)、大于(&gt;)、小于(&lt;)等。 3. **正则表达式**:可用于字符串...

    报告面试题汇总(Python、Redis、MySQL、PostgreSQL、Kafka、数据结构、算法、编程、网络).zip

    广而告之,欢迎关注我的微信公众号...偶尔打印数字和字母判断字符串中是否字符全都不同極形判断两个给定的字符串排序后是否一致词汇替换问题机器人坐标计算语法一韓語詞彙goroutine和channel使用一实现阻塞读的并发安全

    java面试题目精选

    - **StringBuffer类**:对比了String与StringBuffer在字符串操作上的异同。 - **10.2 java.util包** - **集合类**:解释了集合框架的基本概念。 - **核心接口及其实现**:介绍了集合框架中的主要接口及其典型...

    华为 OD 机试真题部分题解+全部题解见《华为机试真题》专栏

    这些题目都是编程面试中常见的算法问题,考察了字符串操作、矩阵遍历以及基本的数学和逻辑思维。在准备华为OD机试时,考生应熟悉这些基本概念,并通过大量练习提高解决问题的能力。同时,注意题目提示,避免直接复制...

    CSS进阶学习资源 面试题

    - **`join()`**:将数组的所有元素放入一个字符串中。元素通过指定的分隔符进行分隔。 以上内容覆盖了CSS书写顺序、书写规范、注意事项、文件命名以及Flash和JavaScript交互的基本概念,还包括了JavaScript数组常用...

    redis面试专栏(面试各种面试场景)

    Redis支持五种基本数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)和Sorted Set(有序集合)。理解这些类型的特点和用法是基础,例如,String可以存储简单的键值对,List适合处理队列或栈的...

    32 数据转换总结及常见面试题目解析慕课专栏(1)1

    此外,还有数值范围验证@Min、@Max,日期验证@Past、@Future,字符串长度@Size,数字精度@Digits,以及正则表达式@Pattern等。Hibernate Validator还添加了额外的注解,如@NotBlank、@Email、@Length、@NotEmpty和@...

    bigsai的数据结构与算法、LeetCode图解、剑指offer图解文章专栏,致力于最好懂的数据结构与算法专栏.zip

    LeetCode的题目涵盖了字符串操作、数组操作、二叉树遍历、回溯法、动态规划等众多主题,是提高编程技能的绝佳工具。 《剑指Offer》是针对程序员面试的一本经典书籍,书中包含了大量面试题,覆盖了数据结构、算法、...

    htmlunit-2.9-SNAPSHOT-with-dependencies.zip

    5. **模拟浏览器行为**:HTMLUnit可以模拟多种浏览器的行为,如设置User-Agent字符串、处理cookies、管理会话等。 6. **性能与速度**:由于不依赖图形界面,HTMLUnit比完整浏览器更快,适合大规模的自动化测试。 7...

    leetcode知乎-Java-practise:记录Java的练习代码,排序、leetcode等

    此外,项目可能还包括一些涉及到字符串处理、位操作、数学逻辑和贪心算法的题目。这些问题可以帮助你深化对Java语言特性的理解,提升问题解决能力。 总的来说,“leetcode知乎-Java-practise”是一个很好的学习资源...

Global site tag (gtag.js) - Google Analytics