1747. 连续递增或递减数

  1. 连续递增或递减数
    请问 100∼n中连续递增或者连续递减的 3 位数有总和是多少,有多少个?

连续递递增或递减指的是三位数相邻的两位之间都是递增的或者是递减的。
比如:
139 ,三位数就是连续递增的,因为 1<3, 3<9;
再比如:
931,三位数就是连续递减的,因为 9>3 , 3>1;
在这里插入图片描述
在这里插入图片描述

#include <iostream>
using namespace std;
int main()
{
	int n , i , ge ,shi , bai , num = 0 ,sum = 0;
	cin >> n ;
	for (i = 100 ; i <= n ; i++)
	{
		bai = i / 100 ;
		shi = i % 100 / 10 ;
		ge = i % 100 % 10 ;
		if ((ge>shi && shi > bai) || (ge<shi && shi<bai))
		{	
			num += 1 ;
			sum += i ;
		}
	}
	cout << sum << endl ;
	cout << num << endl ;
	return 0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、查找 1. 算法设计题 :已知n元顺序表a0, a1, … , an-1按关键字递增有序存储。给定关键字值key,编写算法用对分查找求下标i,满足ai-1<key且aikey。 2. 编程题:输入n个两两互不相等的整,以这些整为关键字建立平衡的二叉排序树。判断该二叉树是否为平衡的,输出判断结果;输出该二叉树的中序遍历关键字访问次序。 3. 从空树起连续插入以下20个关键字构建m=4的B-树。 50, 15, 09, 18, 03, 85, 33, 72, 48, 22, 91, 88, 11, 99, 06, 56, 68, 77, 43, 36。 4. 16个关键字组成的5阶B-树如下图所示,请按关键 字递减的次序删除所有结点至空树,画出每删除1个关键字后得到B-树,直至空树。 5. 12个关键字如本电子教案例1所示,设H(K)=K mod 13,地址空间范围0~15,用二次探测再散列解决冲突。画出哈希表;若各元素等概率查找,求成功查找时的平均查找长度。 二、内部排序 1.算法设计与分析题:将直接插入排序的内循环改造为使用对分查找实现元素插入,请写出基于对分查找的插入排序算法并给出其时间复杂度分析。 2.算法设计:将教案给出的非递归直接插入排序和冒泡排序算法用递归算法实现。 3.算法设计:带附加头结点单链表将各据结点按关键字升序连接。 4.编程题:键盘输入n个无符号整,用链式基排序实现由小到大排序,输出排序结果。 提示:对于C语言32bit宽的unsigned类型,可以采用16进制形式来实现基排序,即32bit共有8个16进制位,每个16进制位进行一趟分配和收集,共8趟。
第一篇 面试题 ................................................................................ 8 1.1. 简介 ............................................................................................................... 8 1.2. 面试题集合(一) .......................................................................................... 8 1.2.1. 把二元查找树转变成排序的双向链表.................................................... 8 1.2.2. 下排每个都是先前上排那十个在下排出现的次 ..........................11 1.2.3. 设计包含 min 函的栈 ...................................................................... 14 1.2.4. 求子组的最大和.............................................................................. 20 1.2.5. 在二元树中找出和为某一值的所有路径 .............................................. 22 1.2.6. Top K 算法详细解析---百度面试 ......................................................... 29 1.2.7. 翻转句子中单词的顺序....................................................................... 31 1.2.8. 判断整序列是不是二元查找树的后序遍历结果 ................................ 33 1.2.9. 查找最小的 K 个元素-使用最大堆....................................................... 35 1.2.10. 求二叉树中节点的最大距离................................................................ 37 1.3. 面试题集合(二) ........................................................................................ 40 1.3.1. 求 1+2+…+n....................................................................................... 40 1.3.2. 输入一个单向链表,输出该链表中倒第 k 个结点............................. 44 1.3.3. 输入一个已经按升序排序过的组和一个字.................................... 46 1.3.4. 输入一颗二元查找树,将该树转换为它的镜像.................................... 48 1.3.5. 输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往 右的顺序打印................................................................................................... 49 1.3.6. 在一个字符串中找到第一个只出现一次的字符。如输入 abaccdeff,则输出 b 52 1.3.7. n 个字(0,1,…,n-1)形成一个圆圈 .................................................. 53 1.3.8. 定义 Fibonacci 列 ............................................................................ 58 1.3.9. 左移递减列查找某一个.........................................
### 回答1: 可以使用以下语句来实现: ``` SELECT MIN(date), MAX(date) FROM table GROUP BY date - ROW_NUMBER() OVER (ORDER BY date) ``` 其中 `date` 是表中的日期列,你可以指定 `ASC` 或 `DESC` 来决定是按照递增还是递减的顺序进行分组。 例如,如果你希望按照日期的递增顺序分组,可以使用以下语句: ``` SELECT MIN(date), MAX(date) FROM table GROUP BY date - ROW_NUMBER() OVER (ORDER BY date ASC) ``` 如果你希望按照日期的递减顺序分组,可以使用以下语句: ``` SELECT MIN(date), MAX(date) FROM table GROUP BY date - ROW_NUMBER() OVER (ORDER BY date DESC) ``` 这样就可以得到按照连续日期分组的结果了。 ### 回答2: 实现一个可以按照递增递减连续的日期分组的SQL查询,可以使用窗口函和日期函来实现。 假设我们有一个表,包含日期和据两列。首先,我们可以使用ROW_NUMBER()函为每一行添加一个序号,根据日期进行排序。然后,我们可以使用日期函来计算每一行的前一行日期和后一行日期。最后,我们可以通过比较当前行的日期和前一行/后一行日期是否连续,来标记每一行是否属于同一组。 例如,以下是一个示例的SQL查询: ```sql WITH numbered_data AS ( SELECT date, data, ROW_NUMBER() OVER (ORDER BY date) AS row_number, LAG(date) OVER (ORDER BY date) AS previous_date, LEAD(date) OVER (ORDER BY date) AS next_date FROM your_table ) SELECT date, data, CASE WHEN previous_date + INTERVAL '1' DAY = date OR previous_date IS NULL THEN '开始' WHEN next_date - INTERVAL '1' DAY = date OR next_date IS NULL THEN '结束' ELSE '中间' END AS group_flag FROM numbered_data ORDER BY date; ``` 以上查询中,我们首先将原始表通过ROW_NUMBER()函添加了一个序号,然后使用LAG()和LEAD()函分别获取了当前行的前一行和后一行日期。然后,我们通过比较当前行日期和前一行/后一行日期是否连续,使用CASE语句来标记每一行是否属于同一组,如果是连续的则为"中间",如果是最早的一行则为"开始",如果是最晚的一行则为"结束"。最后,我们按照日期对结果进行排序。 请注意,以上示例中的"your_table"应替换为你实际使用的表名,另外,你还可以根据实际需求进行更改和优化。 ### 回答3: 要实现按照递增递减连续的日期进行分组,可以使用SQL中的窗口函ROW_NUMBER()和LAG()。 首先,我们需要创建一个包含日期的示例表,假设表名为"date_table",包含一个名为"date"的日期列。示例据如下: ``` date ---------- 2021-01-01 2021-01-02 2021-01-03 2021-01-05 2021-01-06 2021-01-08 2021-01-09 ``` 接下来,我们可以使用ROW_NUMBER()函为每一行添加一个行号,按照日期进行排序: ```sql SELECT date, ROW_NUMBER() OVER (ORDER BY date) AS row_num FROM date_table ``` 得到的结果如下: ``` date row_num ---------- ------- 2021-01-01 1 2021-01-02 2 2021-01-03 3 2021-01-05 4 2021-01-06 5 2021-01-08 6 2021-01-09 7 ``` 接下来,我们可以使用LAG()函来计算当前行与上一行日期的差值,根据差值是否为1来判断是否需要进行分组。如果差值不为1,则表示当前行与上一行的日期不连续,需要将当前行作为新的分组的起始行。可以使用如下SQL语句来实现: ```sql SELECT date, CASE WHEN LAG(date) OVER (ORDER BY date) + INTERVAL 1 DAY <> date THEN 1 ELSE 0 END AS group_start FROM date_table ``` 得到的结果如下: ``` date group_start ---------- ----------- 2021-01-01 1 2021-01-02 0 2021-01-03 0 2021-01-05 1 2021-01-06 0 2021-01-08 1 2021-01-09 0 ``` 最后,我们可以再次使用ROW_NUMBER()函对group_start进行累加计算,得到最终的分组ID。可以使用如下SQL语句来实现: ```sql SELECT date, SUM(group_start) OVER (ORDER BY date) AS group_id FROM ( SELECT date, CASE WHEN LAG(date) OVER (ORDER BY date) + INTERVAL 1 DAY <> date THEN 1 ELSE 0 END AS group_start FROM date_table ) subquery ``` 最终的结果如下: ``` date group_id ---------- ----------- 2021-01-01 1 2021-01-02 1 2021-01-03 1 2021-01-05 2 2021-01-06 2 2021-01-08 3 2021-01-09 3 ``` 以上就是使用SQL实现按照递增递减连续的日期分组的方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值