菜鸟刷题Day3

简介: 菜鸟刷题Day3

一.字符串压缩面试题 01.06. 字符串压缩 - 力扣(LeetCode)

描述

字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。


解题思路

遍历字符串,统计字符的个数就行,但是将数字转成字符串会有些麻烦,其实给每一位数字加上’\0’就可以得到相应的数字字符。可以考虑这个办法。

int itoa(char*str,int num)
{//简单的一个数字转字符串函数,将转换后的数字字符串放到str空间中
    char tmp[16]={0};
    int count=0;
    while(num)
    {
        tmp[count++]=(num%10)+'0';//将个位数字转换为对应数字字符放到tmp空间中(逆序的)
        num/=10;
  }
    for(int i=0;i<count;i++)
    {
        str[i]=tmp[count-i-1];//逆序将数字字符放入传入的str空间中
    }
return count;//返回转换的数字字符串长度
}
char*compressString(char*S)
{
    int len=strlen(S);
    //申请新的空间,注意空间有可能所需会变大,比如abc->a1b1c1
    char*newstr=(char*)calloc(len,3);
    int pos=0;
    char*s=S;
    while(*s!='\0')
    {
        char*n=s+1;
        while(*n!='\0'&&*n==*s)
            n++;//走到下一个不同字符处停下
        int l=n-s;//相同字符的长度
        newstr[pos++]=*s;//先赋值对应字符
        pos+=itoa(newstr+pos,l);//编写了一个数字转字符函数,将数字放到字符串空间指定位置
        s=n;//下一个不同的字符处
    }
    return strlen(newstr)>=len?S:newstr;
}

但是作为一个手搓过string的博主,这种题目不来占个string的便宜说的过去吗?

首先介绍一个库函数:to_string这是一个将数字转为数字字符的库函数

统计字符的时候,如果下一个字符和当前字符不一致或者说已经到结尾了的时候,该字符也就结束了。

class Solution {
public:
    string compressString(string S) {
        string ans="";
        int cnt=0;
        int len=S.size();//string有效字符用size
        for(int i=0;i<len;i++)
        {
            cnt++;
            if(i==len-1||S[i]!=S[i+1])//到结尾或者下一个字符和该字符不相同就结束了
            {
                ans+=S[i]+to_string(cnt);
                cnt=0;//从头开始计数
            }
        }
        return ans.size()<len?ans:S;
    }
};

二.配对交换:面试题 05.07. 配对交换 - 力扣(LeetCode)

描述

配对交换。编写程序,交换某个整数的奇数位和偶数位,尽量使用较少的指令(也就是说,位0与位1交换,位2与位3交换,以此类推)


解题思路

这没什么骚操作,就当老实人呗。通过按位与分别拿到一个数的奇数位和偶数位,再将奇数位左移一位+偶数位右移一位,就可以达到最后的结果。

int exchangeBits(int num){
    int odd=0b10101010101010101010101010101010;//二进制
    int jdd=0b01010101010101010101010101010101;
    odd&=num;
    jdd&=num;
    int ret=(odd>>1)+(jdd<<1);
    return ret;
}

三.递归乘法:面试题 08.05. 递归乘法 - 力扣(LeetCode)

描述

递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。


解题思路

a*b也就是a个b相加的结果,所以只要递归调用加法就行了。如果有一个数为0,那就直接返回0,有1就直接返回那个数本身。没有这些特殊数,那就只好递归调用咯。递归要有限制条件,这题的限制条件是,我们只需要调用a/b次递归。

int multiply(int A, int B){
    if(B==0)
      return 0;
    if(B==1)
      return A;
    return A+multiply(A,B-1);
}

四.挑7:挑7_牛客题霸_牛客网 (nowcoder.com)

描述

输出 1到n之间 的与 7 有关数字的个数。

一个数与7有关是指这个数是 7 的倍数,或者是包含 7 的数字(如 17 ,27 ,37 … 70 ,71 ,72 ,73…)


解题思路

这个题目要注意的地方在于,存在那种既是七的倍数又包含七的数字,所以判断的时候用||对这两个条件一起判断会比较好,否则还要做额外处理。将这个数与七取模结果为零就表明这个数是七的倍数,至于包含七就只需要不断除十模十即可。

#include <stdio.h>
int main() 
{
    int n=0;
    int count=0;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=7;i<=n;i++)//直接从7开始,因为之前不可能有包含7或者7的倍数
        {
            int tmp=i;
            while(tmp>0)
            {
                if(tmp%10==7)
                    break;
                tmp/=10;
            }
            if(i%7==0||tmp%10==7)
            {
                count++;
            }
        }
        printf("%d",count);
    }
    return 0;
}

人们总是高估短期努力带来的提升,而小看长期坚持带来的提升。今天是刷题第三天了,你还在坚持吗?

相关文章
|
数据库连接 数据库 Python
SQLAlchemy映射表结构和对数据的CRUD
SQLAlchemy映射表结构和对数据的CRUD
|
Java
Java - nested exception is java.lang.StackOverflowError
Java - nested exception is java.lang.StackOverflowError
512 0
|
存储 人工智能 关系型数据库
《深度揭秘:借助MySQL实现AI模型训练全程追溯》
在AI模型训练中,记录训练过程与参数至关重要,有助于优化模型、促进团队协作及问题排查。MySQL凭借强大的数据管理能力,可高效存储和处理结构化数据,确保一致性与完整性。通过设计合理的表结构(如模型信息表、训练记录表等),结合规范的记录流程,能有效支持大规模AI项目。然而,也需应对数据量增长、一致性维护和数据安全等挑战,以充分发挥MySQL的优势,推动AI技术发展。
420 29
|
小程序
新闻电影资讯类小程序模板源码
新闻电影资讯类小程序模板源码
2941 5
|
Java 数据库连接 mybatis
成功解决:Invalid encoding name “UTF8“
这篇文章解释了如何解决MyBatis配置文件中由于编码格式错误导致的"Invalid encoding name 'UTF8'"问题,即将`encoding="UTF8"`更正为`encoding="UTF-8"`。
成功解决:Invalid encoding name “UTF8“
|
算法 搜索推荐 Python
探索Python中的推荐系统:混合推荐模型
探索Python中的推荐系统:混合推荐模型
1145 1
|
存储 NoSQL Java
Redis入门到通关之ZSet命令
Redis入门到通关之ZSet命令
280 0
|
Java
分析JAVA应用CPU占用过高的问题
分析JAVA应用CPU占用过高的问题
255 0

热门文章

最新文章