精华内容
下载资源
问答
  • 字符串相加

    2020-04-13 22:52:39
    字符串相加 LeetCode来源:字符串相加 - 字符串长度不同怎么处理 - 正常运算是低位运算向高位逐渐进位,怎么模拟这个过程 朴素模拟 - 添加哨兵元素“#”当两个字符串都碰到#的时候停止运算 - 反转字符串,计算后再...

    字符串相加

    在这里插入图片描述
    LeetCode来源:字符串相加

    - 字符串长度不同怎么处理
    - 正常运算是低位运算向高位逐渐进位,怎么模拟这个过程
    

    朴素模拟

    - 添加哨兵元素“#”当两个字符串都碰到#的时候停止运算
    - 反转字符串,计算后再反转
    
    class Solution {
    public:
        string addStrings(string num1, string num2) {
            if(num1.size() == 0) return num2;
            if(num2.size() == 0) return num1;
            reverse(num1.begin(), num1.end());
            reverse(num2.begin(), num2.end());
            vector<int>temp(max(num1.size(), num2.size())+1, 0);
            num1 += "#";
            num2 += "#"; 
            int i=0, j=0, cur = 0;
            while(num1[i] != '#' || num2[j] != '#'){
                if(num1[i] != '#') {temp[cur] += (num1[i] - '0'); ++i;}
                if(num2[j] != '#') {temp[cur] += (num2[j] - '0'); ++j;}
                ++cur;
            }
            //for(auto c:temp) cout << c << endl;
            string res = "";
            for(int i=1; i<cur; ++i){
                temp[i] += temp[i-1]/10;
                temp[i-1] %= 10;
            }
            if(temp[cur-1] > 9){temp[cur]+= temp[cur-1]/10; temp[cur-1]%=10;++cur;}
            for(int i=0; i<cur; ++i) res += (temp[i] + '0');
            reverse(res.begin(), res.end());
            return res;
        }
    };
    
    时间复杂度:O(N)
    以下的操作都是可以省略的
    两次反转时间复杂度:O(N)
    存储数据空间复杂度:O(N)
    

    更快版本

    展开全文
  • SqlServer2000,用语数据库字符串相加的一个函数 用于字符串相加,字符串拼接
  • 主要介绍了asp字符串连接符&、多个字符串相加、字符串拼接类,需要的朋友可以参考下
  • Java-String字符串相加及拼接字符串相加String test1 = "test1" ;String test2 = test1 + "test2" + "test3" ;System.out.println(test2); //输出test1test2test3在idea中使用加号,可以将两个字符串直接拼接,就...

    Java-String字符串相加及拼接

    字符串相加

    String test1 = "test1" ;

    String test2 = test1 + "test2" + "test3" ;

    System.out.println(test2); //输出test1test2test3

    在idea中使用加号,可以将两个字符串直接拼接,就如同上面代码一样,自动将两部分拼接,但是String对象长度是不可变的,所以为了做到这种相加拼接,就会创建一个StringBuilder对象进行字符串的拼接。

    在cmd中使用javap -v 文件名.class 对字节码文件加载运行。

    ce49fc8469a953e147be2af6da486019.png

    4c71440add4ddb2dd9f81d83e205d5a1.png

    Code:

    stack=2, locals=3, args_size=1

    0: ldc #2 // String test1

    2: astore_1

    3: new #3 // class java/lang/StringBuilder

    6: dup

    7: invokespecial #4 // Method java/lang/StringBuilder."":()V

    10: aload_1

    11: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

    14: ldc #6 // String test2test3

    16: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

    19: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;

    22: astore_2

    23: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;

    26: aload_2

    27: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

    30: return

    可以看到第三行,new了一个StringBuilder对象,同时调用append()方法,用于字符串的拼接,再调用toString()方法转化为字符串,完成拼接操作。

    效率较低

    可以发现,如果使用过多的加号,就会占用大量资源,因为每次都需要创建多个StringBuilder对象,调用append()和toString()方法,同时还需要生成新的String对象接收。故效率较低。

    concat()和append()

    所以为了效率高的拼接,可以直接使用StringBuilder.append() 或 concat() 方法。

    System.out.println(test1.concat("test4")); //输出test1test4

    b776ece385d6af4b3786ab047cf3368b.png

    因为concat() 方法要求是两个String对象进行拼接,所以效率会很高。同时StringBuilder.append()是直接向原对象追加而不是新建对象,所以效率也高。

    展开全文
  • 本篇文章给大家带来的内容是关于String字符串相加对比介绍(详细),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。String 字符串相加 对比public static void main(String[] args) {String a = ...

    本篇文章给大家带来的内容是关于String字符串相加对比介绍(详细),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

    String 字符串相加 对比

    public static void main(String[] args) {

    String a = "helloword";

    final String b = "hello";

    String d = "hello";

    String c = b + "word";

    String e = d + "word";

    String f ="hello"+"word";

    System.out.println(a == c);

    System.out.println(a == e);

    System.out.println(a == f);

    }

    输出:

    true

    false

    true

    首先要明确的是 引用数据类型 == 比较的是地址值,equal 没重写比较的是地址值,重写之后比较的是内容.String重写了,StringBuffer没有重写

    其次:

    a==c 为true是因为 b为final类型,当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用。也就是说在用到该final变量的地方,相当于直接访问的这个常量,不需要在运行时确定。因此在上面的一段代码中,由于变量b被final修饰,因此会被当做编译器常量,所以在使用到b的地方会直接将变量b 替换为它的 值。所以 c = b+"word" 等于 c = “hello”+“word” 同--->有final时是直接比较内容而不是地址。

    a ==e 为false是因为e = d+"word" 其实是创建了一个StringBuffer对象,然后用StringBuffer对象执行append方法来创建出字符串对象“ab”,然后再转换成为String。但是这个转换后的String对象,也就是上面的s3是放在堆里面的。而s4则是字符串常量,放在常量池里面。所以返回的是false。 ----->地址值不同

    a ==f 为true 是因为: 常量相加的时候,其实是在编译的时候就直接相加为“helloword”,这是JVM的优化,所以运行的时候,a和f的字节码是一样的。因为在常量池中有了一个“helloword”,所以两个引用指向的是一个字符串“helloword”,所以返回结果也是true。----->指向同一个地址

    【相关推荐:Java教程】

    展开全文
  • 415. 字符串相加题目给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。注意:num1 和num2 的长度都小于 5100.num1 和num2 都只包含数字 0-9.num1 和num2 都不包含任何前导零。你不能使用任何內建 ...

    415. 字符串相加

    题目

    给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。

    注意:

    num1 和num2 的长度都小于 5100.

    num1 和num2 都只包含数字 0-9.

    num1 和num2 都不包含任何前导零。

    你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。

    解题思路

    思路:双指针,模拟

    在这里,先说明一下,题目中注意部分的最后一个,不能直接将输入的字符串转换为整数,这里说的是不能将整个字符串转换之后进行计算,并非说完全不能使用类型转换。

    在这里,使用双指针的方法,然后模拟加法运算,具体的做法及注意如下:

    定义双指针 p、q,分别指向 num1,num2 末尾;

    定义变量 carry,用以存储进位;

    开始模拟计算(注意要加上进位),这里相加结果当大于 10 时,将结果模 10,然后再将此时的取模结果添加到 ans 头部;

    因为 num1 和 num2 的长度可能不等,那么就有可能出现索引溢出的情况。当出现这种情况时,要将较短的字符串前面添加 0,用以后续的计算。

    循环计算直至结束,这里要注意进位 carry 是否不为 0,当 carry 为 1 的情况下,也要将 1 添加到 ans 头部。

    算法的实现过程图解如下:

    具体的代码实现如下。

    代码实现

    class Solution:

    def addStrings(self, num1: str, num2: str) -> str:

    # 用以存储计算结果

    ans = ""

    # 定义指针分别指向 num1, num2 末尾

    p = len(num1) - 1

    q = len(num2) - 1

    # 存储进位

    carry = 0

    # 模拟加法运算

    # 这里将 carry 放到条件中,是考虑后续计算结束后,还有进位,也就是 carry 为 1 的情况

    while p >= 0 or q >= 0 or carry:

    # 由于有可能出现索引溢出的现象,

    # 当较短的字符串索引溢出时,要在头部添加 0,用以后续计算

    elem1 = int(num1[p]) if p >= 0 else 0

    elem2 = int(num2[q]) if q >= 0 else 0

    # 模拟计算,注意加上进位

    tmp = elem1 + elem2 + carry

    # 相加结果可能大于 10

    # 计算进位,并且就将结果模 10,余数添加到 ans 头部

    carry = tmp // 10

    ans = str(tmp % 10) + ans

    # 往前继续计算

    p -= 1

    q -= 1

    return ans

    实现结果

    欢迎关注

    公众号 【书所集录】

    展开全文
  • Java中字符串相加和字符串常量相加区别
  • LeetCode中的字符串相加是一道简单题,因为题目只涉及两个整数相加,思路相对简单;最近笔试遇到一道题,是将任意两个非负字符串数字相加,可能是整数也可能是带小数的,而且最后输出要完全符合数字的要求,即数字的...
  • 首先从一张图开始,图中对字符串相加和StringBuild.append()做了性能对比。有人说字符串每次相加都新建了一个对象所以慢,事情真的是这样吗?先要了解真相最好的方法当然是反编译了,使用 javap -c 反编译的结果...
  • 字符串相加给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。注意:num1 和num2 的长度都小于 5100.num1 和num2 都只包含数字 0-9.num1 和num2 都不包含任何前导零。你不能使用任何內建 BigInteger 库, ...
  • 通常在html中字符串进行相机 总数:'(parseInt(data.lstContent.lstSptPlan[i].basejoinNum) + parseInt(data.lstContent.lstSptPlan[i].joinNum)) +'</div>...然后就是在ejs中字符串相加时候的语法是: 总数:<%= pars
  • 字符串相加
  • 415. 字符串相加 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。 提示: num1 和num2 的长度都小于 5100 num1 和num2 都只包含数字 0-9 num1 和num2 都不包含任何前导零 你不能使用任何內建 ...
  • 字符串相加 LeetCode传送门 题目大意 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和 思路分析 对两个字符串整数模拟竖式加法的过程,如图。 定义两个指针 i 和 j 分别指向 num1 和 num2的末尾,即最低...
  • 常考算法面试题:字符串相加、字符串相减、字符串相乘 笔者今年秋招,最近投了一些大厂的实习,某为的手撕代码题目为 字符串相乘,某讯的手撕代码题目为字符串相减。 于是去LeetCode和网上搜索了一下,发现这类题目...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,348
精华内容 3,339
热门标签
关键字:

字符串相加