当前位置: 首页 > article >正文

【优选算法】(第三十二篇)

目录

⼆进制求和(easy)

题目解析

讲解算法原理

编写代码

字符串相乘(medium)

题目解析

讲解算法原理

编写代码


⼆进制求和(easy)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给你两个⼆进制字符串 a 和 b ,以⼆进制字符串的形式返回它们的和。
⽰例 1:
输⼊:a = "11", b = "1"
输出:"100"
⽰例 2:
输⼊:a = "1010", b = "1011"
输出:"10101"

讲解算法原理

解法(模拟⼗进制的⼤数相加的过程):
算法思路:

模拟⼗进制中我们列竖式计算两个数之和的过程。但是这⾥是⼆进制的求和,我们不是逢⼗进⼀,⽽是逢⼆进⼀。

编写代码

c++算法代码:

class Solution
{
public:
 string addBinary(string a, string b) 
 {
 string ret;
 int cur1 = a.size() - 1, cur2 = b.size() - 1, t = 0;
 while(cur1 >= 0 || cur2 >= 0 || t)
 {
 if(cur1 >= 0) t += a[cur1--] - '0';
 if(cur2 >= 0) t += b[cur2--] - '0';
 ret += t % 2 + '0';
 t /= 2;
 }
 reverse(ret.begin(), ret.end());
 
 return ret;
 }
};

java算法代码:

class Solution
{
 public String addBinary(String a, String b) 
 {
 StringBuffer ret = new StringBuffer();
 int cur1 = a.length() - 1, cur2 = b.length() - 1, t = 0;
 while(cur1 >= 0 || cur2 >= 0 || t != 0)
 {
 if(cur1 >= 0) t += a.charAt(cur1--) - '0';
 if(cur2 >= 0) t += b.charAt(cur2--) - '0';
 ret.append((char)('0' + (char)(t % 2)));
 t /= 2;
 }
 ret.reverse();
 return ret.toString();
 }
}

字符串相乘(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给定两个以字符串形式表⽰的⾮负整数num1和num2,返回num1和num2的乘积,它们的乘积也表⽰为字符串形式。
注意:不能使⽤任何内置的BigInteger库或直接将输⼊转换为整数。⽰例1:
输⼊:num1="2",num2="3"
输出:"6"
⽰例2:
输⼊:num1="123",num2="456"
输出:"56088"

讲解算法原理

解法(⽆进位相乘然后相加,最后处理进位):
算法思路:

整体思路就是模拟我们⼩学列竖式计算两个数相乘的过程。但是为了我们书写代码的⽅便性,我们选择⼀种优化版本的,就是在计算两数相乘的时候,先不考虑进位,等到所有结果计算完毕之后,再去考虑进位。如下图:

 

编写代码

C++算法代码:

class Solution
{
public:
 string multiply(string n1, string n2) 
 {
 // 解法:⽆进位相乘后相加,然后处理进位
 int m = n1.size(), n = n2.size();
 reverse(n1.begin(), n1.end());
 reverse(n2.begin(), n2.end());
 vector<int> tmp(m + n - 1);
 // 1. ⽆进位相乘后相加
 for(int i = 0; i < m; i++)
 for(int j = 0; j < n; j++)
 tmp[i + j] += (n1[i] - '0') * (n2[j] - '0');
 
 // 2. 处理进位
 int cur = 0, t = 0;
 string ret;
 while(cur < m + n - 1 || t)
 {
 if(cur < m + n - 1) t += tmp[cur++];
 ret += t % 10 + '0';
 t /= 10;
 }
 // 3. 处理前导零
 while(ret.size() > 1 && ret.back() == '0') ret.pop_back();
 reverse(ret.begin(), ret.end());
 return ret;
 }
};

java算法代码:

class Solution
{
 public String multiply(String num1, String num2) 
 {
 int m = num1.length(), n = num2.length();
 char[] n1 = new StringBuffer(num1).reverse().toString().toCharArray();
 char[] n2 = new StringBuffer(num2).reverse().toString().toCharArray();
 int[] tmp = new int[m + n - 1];
 // 1. ⽆进位相乘后相加
 for(int i = 0; i < m; i++)
 for(int j = 0; j < n; j++)
 tmp[i + j] += (n1[i] - '0') * (n2[j] - '0');
 
 // 2. 处理进位
 int cur = 0, t = 0;
 StringBuffer ret = new StringBuffer();
 while(cur < m + n - 1 || t != 0)
 {
 if(cur < m + n - 1) t += tmp[cur++];
 ret.append((char)(t % 10 + '0'));
 t /= 10;
 }
 // 3. 处理进位
 while(ret.length() > 1 && ret.charAt(ret.length() - 1) == '0') 
 ret.deleteCharAt((ret.length() - 1));
 return ret.reverse().toString();
 }
}


http://www.kler.cn/news/341437.html

相关文章:

  • Vue3浮动按钮(FloatButton)
  • C语言二级考试上机题
  • 宠物心肺健康监测仪:医疗科技的新突破
  • 在线绘图工具drawio,visio的平替
  • 数据排列组合实现
  • MySQL【知识改变命运】03
  • 05_23 种设计模式之《建造者模式》
  • Python 打包为 .whl(Wheel)格式的包 发布到 PyPI
  • 《14天从0到1学Java》第二天之01Java中的分支结构if语句
  • Python简介与入门
  • jmeter入门: 安装
  • mpi 示例小程序集锦
  • C语言之扫雷小游戏(完整代码版)
  • SpringBoot美发门店系统:提升服务质量
  • git pull
  • 如何激发员工对FMEA的浓厚兴趣与深度应用?
  • 谈谈英国硕士毕业论文如何收集问卷数据
  • Vue.js组件开发:构建可复用、可维护的前端应用
  • 物理学基础精解【61】
  • quantlab_ai版本v0.1代码发布: 从研报中提取因子并建模(附代码与研报集下载)