算法每日一题——第五天——笨拙的手指

简介: 算法每日一题——第五天——笨拙的手指


原题链接:2058. 笨拙的手指 - AcWing题库

分析

(1)这道题的输入有两个,一个二进制数,一个三进制数,这两个数都有且只有一位数被写错,题目要求完成一段代码,求出正确的数。

(2)二进制数只有两种数字,要么是 1 ,要么是 0 ;三进制数有三种数字,0 ,1 ,2。

(3)这道题数据范围,正确的N是不超过的十进制数,看下图:

(4) 最大的N对应的是32位二进制数,那么我们就可以考虑使用暴力枚举的方法来解决这道题。

(5)因为二进制每一位数字的可能性少,我们果断选择枚举二进制数的每一位。

解析

以题目所给样例为例:

(1)1010只有一位数字被写错,那么正确的数可能是 0010     1110      1000      1011

(2)将这四种可能性化为三进制的形式   100    22    112    2

(3)这四个数中只有一个数是正确的,我们拿这四个数与212比较:

       100与212,三个数字都不同,100不是正确的数。

       22与212,两个数字不同,22不是正确的数。

      112与212,只有一个数字不同,说明112是正确的数。

代码实现

在完成这道题时,需要实现两个功能:二进制数化为三进制数      判断两个三进制数有几位数字不同

想要将二进制数直接化为三进制数比较困难(可能是因为我比较菜),我们可先将二进制数化为十进制数,再将十进制数化为三进制数

(1)二进制数化为十进制数

int Conversion1(char* i)
{
  int rnt = 0;
  int m = 0;
  int x = strlen(i);
  for (m = 0; m < x; m++)
  {
    if (i[m] == '1')
    {
      rnt += pow(2, x - m - 1);
    }
  }
  return rnt;
}

(2)十进制数化为三进制数

char* Conversion2(int m)
{
  int i = 0;
  char* rnt = (char*)malloc(sizeof(char) * 10);
  while (m)
  {
    rnt[i] = (m % 3)+'0';
    m = m / 3;
    i++;
  }
  rnt[i] = '\0';
  int tmp = 0;
  int n = i - 1;
  for (int m = 0; m < i / 2; m++)
  {
    tmp = rnt[n];
    rnt[n] = rnt[m];
    rnt[m] = tmp;
    n--;
  }
  return rnt;
}

(3)判断两个三进制数有几位数字不同

int Count(char* x, char* y)
{
  int rnt = 0;
  int end1 = strlen(x)-1;
  int end2 = strlen(y)-1;
  while (end1 >= 0 && end2 >= 0)
  {
    if (x[end1] != y[end2])
    {
      rnt++;
    }
    end1--;
    end2--;
  }
  if (end1 >= 0)
  {
    rnt += end1 + 1;
  }
  if (end2 >= 0)
  {
    rnt += end2 + 1;
  }
  return rnt;
}

(4)完整代码

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int Conversion1(char* i)
{
  int rnt = 0;
  int m = 0;
  int x = strlen(i);
  for (m = 0; m < x; m++)
  {
    if (i[m] == '1')
    {
      rnt += pow(2, x - m - 1);
    }
  }
  return rnt;
}
char* Conversion2(int m)
{
  int i = 0;
  char* rnt = (char*)malloc(sizeof(char) * 10);
  while (m)
  {
    rnt[i] = (m % 3)+'0';
    m = m / 3;
    i++;
  }
  rnt[i] = '\0';
  int tmp = 0;
  int n = i - 1;
  for (int m = 0; m < i / 2; m++)
  {
    tmp = rnt[n];
    rnt[n] = rnt[m];
    rnt[m] = tmp;
    n--;
  }
  return rnt;
}
int Count(char* x, char* y)
{
  int rnt = 0;
  int end1 = strlen(x)-1;
  int end2 = strlen(y)-1;
  while (end1 >= 0 && end2 >= 0)
  {
    if (x[end1] != y[end2])
    {
      rnt++;
    }
    end1--;
    end2--;
  }
  if (end1 >= 0)
  {
    rnt += end1 + 1;
  }
  if (end2 >= 0)
  {
    rnt += end2 + 1;
  }
  return rnt;
}
int main()
{
  int i=0;
  char a[40];
  char b[40];
  char *c;
  scanf("%s", a);
  scanf("%s", b);
  while (1)
  {
    if (a[i] == '0')
    {
      a[i] = '1';
    }
    else
    {
      a[i] = '0';
    }
    c=Conversion2(Conversion1(a));
    if (Count(c, b) == 1)
    {
      printf("%d", Conversion1(a));
      return 0;
    }
    else
    {
      if (a[i] == '0')
      {
        a[i] = '1';
      }
      else
      {
        a[i] = '0';
      }
    }
    i++;
  }
} 
相关文章
|
7月前
|
存储 算法 安全
C# | 上位机开发新手指南(五)校验算法——CRC
当我们在进行数据传输时,可能会因为信道噪声、干扰等因素导致数据出现错误,从而影响传输的可靠性和准确性。此时,我们需要一种方法来检测数据是否出现错误,并尽可能快速地发现和纠正错误。CRC(Cyclic Redundancy Check)校验算法就是一种常用的数据校验方法,它通过对数据进行处理生成校验码,从而实现对数据的完整性和准确性进行验证。 使用CRC校验的意义在于能够提高数据传输的可靠性,降低数据传输错误率,确保数据的完整性和准确性。在各个领域中,如通信、网络、存储等,CRC校验都得到了广泛的应用。
341 0
C# | 上位机开发新手指南(五)校验算法——CRC
|
7月前
|
算法 C#
C# | 上位机开发新手指南(四)校验算法
校验算法是一种用于验证数据传输过程中是否出现错误或丢失的算法。 在数据传输过程中,由于噪声、干扰、传输错误等因素的影响,会导致数据传输过程中出现错误或丢失。 为了保证数据传输的准确性,需要在数据传输过程中添加校验码。发送端通过计算数据的校验码并将其附加到数据中一起发送出去,接收端再次计算校验码并将其与接收到的校验码进行比较,如果两者相同,则说明数据传输过程中没有出现错误或丢失。
270 0
C# | 上位机开发新手指南(四)校验算法
|
算法 Java C++
算法题:笨拙的手指
题目来源:AcWing2058 奶牛贝茜正在学习如何在不同进制之间转换数字。 但是她总是犯错误,因为她无法轻易的用两个前蹄握住笔。
92 0
笨拙的手指——acwing算法题第一天
笨拙的手指——acwing算法题第一天
笨拙的手指——acwing算法题第一天
|
机器学习/深度学习 传感器 人工智能
意念加AI算法「复原」每个手指,智能义肢登上Nature子刊封面
使用「意念」控制机械,让肢体缺失的残疾人过上正常人的生活,这听起来像是出现在电影中的场景。最近,瑞士洛桑联邦理工学院(EPFL)展示的新技术却让科幻变成了现实,他们的研究还登上了最新一期自然杂志子刊《Nature Machine Intelligence》的封面。
255 0
意念加AI算法「复原」每个手指,智能义肢登上Nature子刊封面
|
算法 开发工具 芯片
如何创建一个Flash算法文件 | 《平头哥剑池CDK快速上手指南》第三章
CDK支持Flash烧写功能,为了能够适配不同的Flash器件的编程逻辑,CDK允许开发人员通过Flash算法文件的适配,实现Flash器件的编程,从而实现对某个芯片平台的Flash烧写。
如何创建一个Flash算法文件 | 《平头哥剑池CDK快速上手指南》第三章
|
1天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
102 80
|
20天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
26天前
|
机器学习/深度学习 算法 Serverless
基于WOA-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM
本项目利用鲸鱼优化算法(WOA)优化支持向量机(SVM)参数,针对乳腺癌早期诊断问题,通过MATLAB 2022a实现。核心代码包括参数初始化、目标函数计算、位置更新等步骤,并附有详细中文注释及操作视频。实验结果显示,WOA-SVM在提高分类精度和泛化能力方面表现出色,为乳腺癌的早期诊断提供了有效的技术支持。
|
6天前
|
供应链 算法 调度
排队算法的matlab仿真,带GUI界面
该程序使用MATLAB 2022A版本实现排队算法的仿真,并带有GUI界面。程序支持单队列单服务台、单队列多服务台和多队列多服务台三种排队方式。核心函数`func_mms2`通过模拟到达时间和服务时间,计算阻塞率和利用率。排队论研究系统中顾客和服务台的交互行为,广泛应用于通信网络、生产调度和服务行业等领域,旨在优化系统性能,减少等待时间,提高资源利用率。