三入门模拟4&四算法初步1/2-排名/散列

s牛客网

n进制转化为十进制有两种方法:

//正向:
int id  = 0;
for(int i = 0; i < len; i++)
    id = id * n + (str[i] -'0') ;

//反向:
int id = 0, product = 1;
for(int i = len -1; i >=0; i--)
{
    id += product * str[i];
    product *= n;
}
题解 | #数制转换#_牛客网用栈即可 #include #include #include using namespace std; int main(){ string s; stackans;_牛客网_牛客在手,offer不愁icon-default.png?t=N7T8https://www.nowcoder.com/discuss/443847451172196352?sourceSSR=search

晴问算法

1.入门模拟-字符串处理

句子逆序输出
⚠️字符串长度要多一位,因为末尾有/0, 设置为大约500条字符串即可通过,但1000条更保险。
单词数统计
公共前缀 

总思想

简单模拟!!2的幂!!

⚠️重要!!非常基础!:

PTA | 程序设计类实验辅助教学平台千名教师建设,万道高质量题目,百万用户拼题的程序设计实验辅助教学平台icon-default.png?t=N7T8https://pintia.cn/problem-sets/994805342720868352/exam/problems/994805474338127872?type=7&page=0

小思维积累点:

1。

2.输出三位数的百,十,个位:

657在计算机中可看成 int ,也可以看成三个char,char [4](多一位,因为字符串末尾有‘/0’)

2.算法初步-排名

1.两种排名要求

首先从大到小排序

排名如何表示:都用下标的函数表示:i+1(i从0开始)

排名如何算,不同之处:

  1 2 2 2 5,设置rank = 1, 与前一名(i-1)比较分数是否相同,若相同rank不变并输出;若不同rank+1并输出。

  1 4 4 4 5,设置sameRankCount = 1(用于输出),与后一名(i+1)比较分数若相同则sameRankCount++,直到找到后一名是不同的分数,然后一次性连续输出sameRankCount行结果,再重置为1.

int sameRankCount = 1;
    for(int i = 0; i < n; i++)
    {
       if(i < n-1 && score[i]== score[i+1])
            sameRankCount ++;
        else
            {
                for(int j = 1; j <= sameRankCount; j++)
                    printf("%d %d\n", score[i], i+1);
                sameRankCount = 1;
            }
    }

3.算法初步-散列

散列的主要思想:

哈希表的下标(索引)是每个元素映射后的值,因此它的长度由元素大小决定,一般来说(根据映射规则),元素越大对应的索引也越大,因此,由哈希表从小到大输出的索引(其对应元素)是严格递增的, 这可以运用在两个集合求并集并升序输出。

哈希表存放的内容一般是bool型(true,false),也可以是数字,看题目要求是否与个数有关(如晴问算法集合求差2)

小思维积累点:

1.不用if else, 减少代码量:晴问算法,⚠️,bool hash[ ] 

也可以直接 printf("%d", hash[x] )  因为计算机中只有ture是1,其余都是0.

 while(m--)
    {
        int x;
        scanf("%d", &x);
       printf("%d", hash[x] ? 1: 0);
       printf(m != 0 ? " " : "\n");
    }

2.晴问算法,以后遇到a,b和b,a算作同一对的类似要求,就可以考虑给它排序!3.要求输出的末尾不许有多余的空格如:1 2 3,有两种方法,

一是把最后一个元素特殊处理;即都先输出元素; 其余再输出空格,最后一个不再输出空格;如

二是把第一个元素特殊处理,即第一个元素不先输出空格, 其余都先输出空格;然后再输出元素。

该方法一般用于:不知道输出数组有多少个应输出元素的情况,如根据哈希表输出ture的索引。

3.潜在朋友:每次清零0️⃣!+自己不算朋友! 

#include <iostream>
#include <string.h>//memset()
using namespace std;
const int MAX_M = 205;
int hashTable[MAX_M] = {0};
const int MAX_N = 205;
int people[MAX_N] = {0};
int main(){
    int n, m;
   while( scanf("%d%d", &n, &m) != EOF)
   { 
       memset(hashTable, 0, 205);//每次都要清零!
       memset(people, 0, 205);
       for(int i = 0; i < n; i++)
    {
        scanf("%d", &people[i]);
      //记录下读者i喜欢的书编号,因为后续读者要按i从0-n-1输出
        hashTable[people[i]]++;//自己喜欢也会++一次!
    }
    for(int i = 0; i < n; i++)
    {
        if(hashTable[people[i]] > 1)
           printf("%d\n", hashTable[people[i]]-1);//自己不算朋友
        else
           printf("BeiJu\n");
    }
   }
    return 0;
}

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个调和级数,需要使用递归算法来求前n项之和。 具体算法如下: 1. 如果n等于1,那么返回1。 2. 否则,递归求前n-1项之和,并加上1/n。 最后得到的结果即为前n项之和。 例如,在这个序列中,如果要求前5项之和,可以按如下方式计算: 1 + 1/2 - 1/3 + 1/4 -1/5 = (1 + 1/2 - 1/3 + 1/4) - 1/5 = (1 + 1/2 + 1/3 + 1/4) - (1/3 + 1/5) = 2.083 - 0.466 = 1.617 所以,这个序列的前5项之和为1.617。 ### 回答2: 输入一个整数n,代表需要求这个序列的前n项之和。 首先,需要根据题目中给出的公式,明确递归函数的基本情况。当n等于1时,序列的和就是1。 当n大于1时,我们需要递归地调用函数来求前n-1项之和,并加上第n项的值。第n项的值可以根据该项的奇偶性得到,如果n是奇数,则第n项的值为1/n,否则第n项的值为-1/n。 然后我们可以写出递归函数sum(n),如下所示: ``` def sum(n): if n == 1: return 1 elif n % 2 == 1: return sum(n-1) + 1/n else: return sum(n-1) - 1/n ``` 最后,我们只需要调用函数sum(n)来求出前n项之和即可。 ### 回答3: 要求使用递归算法求下列序列的前n项之和,首先需要明确递归算法的特点:递归算法是一种将问题划分成子问题然后解决的方法,在解决子问题的过程中往往会出现重复的计算。为了避免重复计算,递归算法往往使用递归调用的方式来缓存已经计算过的结果,这样可以大幅提高算法的效率。 对于这道题目,可以使用递归算法来求解。从序列的第一项开始,根据序列的规律可以得出如下公式: $$ S_n = 1 - \frac{1}{2} + \frac{1}{3} - ... + (-1)^{n-1}\frac{1}{n} $$ 其中,$S_n$ 表示前 n 项的和。 根据这个公式,可以写出递归函数: ```python def sum_n(n): if n == 1: return 1 else: return sum_n(n - 1) + (-1) ** (n - 1) * 1 / n ``` 这个函数可以理解为,前 n 项的和等于前 n-1 项的和加上第 n 项的值,其中第 n 项的值根据公式来推导。当 n 等于 1 时,即只有一项时,返回 1。 使用这个递归函数,可以很方便地计算出前 n 项的和。例如,如果要计算前 5 项的和,可以调用函数 `sum_n(5)`,得到答案为 $1-\frac{1}{2}+\frac{1}{3}-\frac{1}{4}+\frac{1}{5}=\frac{619}{420}$。 需要注意的是,在计算中可能会出现计算误差,因此最好使用 Python 的 Decimal 类型来对浮点数进行精确计算,以确保得到正确的答案。例如,将递归函数修改为如下代码,可以确保得到正确的结果: ```python from decimal import Decimal def sum_n(n): if n == 1: return Decimal(1) else: return sum_n(n - 1) + (-1) ** (n - 1) * Decimal(1) / Decimal(n) ``` 最后,需要注意的是,由于递归算法的特点,当 n 较大时,递归函数的调用次数会增加,可能会导致程序运行时间较长,因此需要注意优化算法效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值