对于几进制,其实主要就是对进制取余和整除,取余的结果就是当前位的,整除的结果就是进位的。

67. Add Binary

https://www.cnblogs.com/grandyang/p/4084971.html

从两个string的末尾开始转int型相加,注意carry的计算。

如果某一个数少于另一个数,就用0代替这一位,这种思路记住:

int num1 = m >= 0 ? (a[m--] - '0') : 0;
int num2 = n >= 0 ? (b[n--] - '0') : 0;

class Solution {
public:
string addBinary(string a, string b) {
int m = a.size(),n = b.size();
if(m <= )
return b;
if(n <= )
return a;
m--,n--;
string res = "";
int carry = ;
while(m >= || n >= ){
int num1 = m >= ? (a[m--] - '') : ;
int num2 = n >= ? (b[n--] - '') : ;
int sum = num1 + num2 + carry;
carry = sum/;
res = to_string(sum % ) + res;
}
return carry == ? res : "" + res;
}
};

2. Add Two Numbers

这题的解题思路几乎与Add Binary一模一样,变化在于每次要生成一个新的链表,然后用当前的尾节点指向。注意if(p1)和if(p2)的使用。

http://www.cnblogs.com/grandyang/p/4129891.html

依旧记住ListNode* p1 = l1,p2 = l2;这样写是会报错的,int、float这样初始化都没有问题。

class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if(l1 == NULL)
return l2;
if(l2 == NULL)
return l1;
ListNode* p1 = l1;
ListNode* p2 = l2;
ListNode* dummy = new ListNode(-);
ListNode* cur = dummy;
int carry = ;
while(p1 != NULL || p2 != NULL){
int num1 = p1 == NULL ? : p1->val;
int num2 = p2 == NULL ? : p2->val;
int sum = num1 + num2 + carry;
carry = sum/;
int value = sum%;
cur->next = new ListNode(value);
cur = cur->next;
if(p1)
p1 = p1->next;
if(p2)
p2 = p2->next;
}
if(carry)
cur->next = new ListNode(carry);
return dummy->next;
}
};

445. Add Two Numbers II

这个题和Add Two Numbers相似,但是这个题是把最高位放在了链表的前面,但数字的相加必须从最低位开始。

可以选择用栈来存储数字,也可以使用链表反转。

使用链表反转,先将l1、l2反转,然后时候用和Add Two Numbers一样的方法做计算,然后再反转这个生成的记过就好了。

class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if(l1 == NULL)
return l2;
if(l2 == NULL)
return l1;
l1 = reverse(l1);
l2 = reverse(l2);
ListNode* p1 = l1;
ListNode* p2 = l2;
ListNode* dummy = new ListNode(-);
ListNode* cur = dummy;
int carry = ;
while(l1 != NULL || l2 != NULL){
int num1 = l1 == NULL ? : l1->val;
int num2 = l2 == NULL ? : l2->val;
int sum = num1 + num2 + carry;
carry = sum/;
cur->next = new ListNode(sum%);
cur = cur->next;
if(l1)
l1 = l1->next;
if(l2)
l2 = l2->next;
}
if(carry)
cur->next = new ListNode(carry);
ListNode* res = reverse(dummy->next);
return res;
}
ListNode* reverse(ListNode* node){
ListNode* pre = NULL;
ListNode* cur = node;
while(cur){
ListNode* tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
};

43. Multiply Strings

https://www.cnblogs.com/grandyang/p/4395356.html

将问题转换为正常的数字相乘计算过程。

m位数字和n位数字相乘,生成的数字最多只有m+n位。

从低位相乘到高位,每次取出的两个数的乘积要加上之前一个低位保存的数字,低位更新保存的数字,高位加上进位的数字。result[i+j+1] = sum%10只能是等于符号,不能是加号。因为你需要更新低位的数字。

在生成的数字中可能在低位存在多个0,这个时候都需要跳过不转换为string。

Input:
"9133"
"0"
Output:
"0000"

class Solution {
public:
string multiply(string num1, string num2) {
int m = num1.size(),n = num2.size();
vector<int> result(m+n,);
string res = "";
for(int i = m - ;i >= ;i--){
for(int j = n - ;j >= ;j--){
int sum = result[i+j+] + (num1[i] - '') * (num2[j] - '');
result[i+j+] = sum%;
result[i+j] += sum/;
}
}
for(int i = ;i < result.size();i++){
if(res.empty() && result[i] == )
continue;
res += result[i] + '';
}
return res.empty() ? "" : res;
}
};

29. Divide Two Integers

这道题让我们求两数相除,而且规定我们不能用乘法,除法和取余操作,所以本题使用位操作。

在这里核心思路是使用逆向二分法的思路来进行计算。

既然不能用乘、除、取模,只能用移位操作来完成了。将除数 divisor 每次左移一位,找到最接近被除数且不大于被除数 dividend的一个数,然后将被除数减去这个数,继续之前的操作。例如:31除以3,将3不断左移,直到左移3位后达到最接近31且不大于31的数,即3*2*2*2=24(此时相当于将3乘以了8,这个8是结果的一部分),然后将31-24=7,继续之前的操作,左移3,直到最接近7且不大于7的一个数,即将3左移一位得到3*2=6(这个2也是结果的一部分),然后7-6=1,继续之前的操作,因为3已经大于1了,所以不需要左移了,即得到最后的结果为:8+2=10

https://blog.csdn.net/xiaoguaihai/article/details/84594248 

oj上有个test case如下:

-2147483648
-1

必须用long long来计算才能不保证溢出。

freq必须初始化为1,不然左移乘以两倍也不发生变化。每次判断条件必须先判断乘以2倍后是否超过m,如果不超过,就不用进行循环,freq也就不用再翻倍。

注意两个循环的判断条件都是大于等于>=,等于的情况也必须计算。

刚开始写了一个错误代码:

tmp << 1;
freq << 1;

这样会造成无限循环,因为tmp和freq的值并没有发生变化,我以为左移了就自动发生变化了,还是需要赋值的。

class Solution {
public:
int divide(int dividend, int divisor) {
long long res = ;
long long m = abs((long long)dividend),n = abs((long long)divisor);
while(m >= n){
long long tmp = n;
long long freq = ;
while(m >= (tmp << )){
tmp = tmp << ;
freq = freq << ;
}
m = m - tmp;
res += freq;
}
if((dividend > ) ^ (divisor > ))
res = -res;;
return res > INT_MAX ? INT_MAX : res;
}
};

Multiply Strings 字符串相乘的更多相关文章

  1. [LeetCode] 43. Multiply Strings ☆☆☆(字符串相乘)

    转载:43. Multiply Strings 题目描述 就是两个数相乘,输出结果,只不过数字很大很大,都是用 String 存储的.也就是传说中的大数相乘. 解法一 我们就模仿我们在纸上做乘法的过程 ...

  2. [LeetCode] Multiply Strings 字符串相乘

    Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...

  3. [LeetCode] 43. Multiply Strings 字符串相乘

    Given two non-negative integers num1 and num2represented as strings, return the product of num1 and  ...

  4. 43. Multiply Strings 字符串相乘

    1. 原始题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2&qu ...

  5. 043 Multiply Strings 字符串相乘

    给定两个以字符串表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积.注意:    num1 和 num2 的长度均小于110.    num1 和 num2 均只包含数字 0 ...

  6. Leetcode43. Multiply Strings字符串相乘(大数相乘)

    给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2", num ...

  7. 43. Multiply Strings字符串相乘

    网址:https://leetcode.com/problems/multiply-strings/submissions/ 参考:https://leetcode.com/problems/mult ...

  8. [Leetcode] Multiply strings 字符串对应数字相乘

    Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...

  9. 【LeetCode每天一题】Multiply Strings(字符串乘法)

    Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and ...

随机推荐

  1. [javaEE] EL表达式调用java方法

    1.新建个类,类里面定义静态方法 package com.tsh.utils; import java.net.URLEncoder; public class ELFunc { public sta ...

  2. SQL语句整理(二) 数据定义语言DDL

    前言: 这是我学数据库时整理的学习资料,基本上包括了所以的SQL语句的知识点. 我的教材是人大王珊老师的<数据库系统概论>. 因为是手打的,所以会用一些细节打错了,但都挺明显也不多(考完试 ...

  3. tr设置display属性时,在FF中td合并在第一个td中显示的问题

      今天用firefox测试页面的时候,发现用javascript控制 tr 的显示隐藏时,当把tr的显示由“display:none”改为“display:block”时,该tr下的td内容合并到了 ...

  4. 从官网下载mod_jk.so

    最近在搞apache和tomcat集群,这里就要用到mol_jk.so,在官网找了很久才知道在哪里下载,英语是硬伤啊. 1.打开tomcat官网 http://tomcat.apache.org/ 2 ...

  5. JavaScript的重载(通过argument.length)

    偶然间在博客园看到的关于js的重载(重载就是一组具有相同名字.不同参数列表,实现不同操作的函数或方法)问题,作为初学者,在看红宝书的时候,记得书中有概念说明js是没有重载的 所以,觉得有必要把这一段 ...

  6. js表单快速取值/赋值 快速生成下拉框

    1.表单取值/赋值公共方法 //表单序列化:文本框的name字段和数据源一致<form id="myForm" onsubmit="return false;&qu ...

  7. ubuntu终端颜色设置

    在 .bashrc中增加 PS1='${debian_chroot:+($debian_chroot)}\[\033[00;32m\]\u @ \h\[\033[00m\]:\[\033[00;34m ...

  8. VScode设置jsx语法自动补全

    1.打开VScode 2.文件>首选项>设置 3.加上以下配置项就可以了 "emmet.includeLanguages": { "javascript&qu ...

  9. hdu 3613 Best Reward (manachar算法)

    Best Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Prob ...

  10. Sass初入门

    什么是CSS预处理器? CSS预处理器定义了一种新的语言,其基本思想是,用一种专门的编程语言,为CSS增加了一些编程的特性,将CSS作为目标生成文件,然后开发者就只要使用这种语言进行编码工作.   什 ...