遇到的几个算法题

1、如何快速求得与某个数平方根最接近的整数

数学上平方根一般由级数展开求得。但是此处只求其近似整数,用二分查找法,复杂度为Log(N)。


2、有一个几个T的大文件,记录了若干价格记录,需要累加计算总价,如何算。现在计算机内存有限。

使用Java内存映射文件 java.nio.MappedByteBuffer ,比java.io.BufferedInputStream 快很多


3、有若干个大文件,里面保存了各个URL的访问记录,顺序是乱的,要求将各个URL 访问的记录数量汇总。计算机内存很小。

将文件的记录重新按照URL的HashCode范围重新写入到若干个文件中,若是其中某个文件依旧太大,再将该文件拆分。这样相同URL只会在同一个文件中。


4、有一个数列0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,......, 给出数列下标,求出该下标对应元素

注意,这是fibonacci数列,其通项为:A(n)=A(n-1)+A(n-2) .用一个循环就可以求出,不要用递归,递归会重复计算。

for(int i=2; i<=n;i++ )
{
      A[n] = A[n-1] + A[n-2];
}


5、给定一串整数,找出其中和最大的连续子数列,包括子数列的位置和最大和。

http://blog.youkuaiyun.com/lilypp/article/details/6124871

线性算法:

这个算法是基于两个结论得来的:
(1)、如果数列A的某个子列A(i, j) 的和S(i, j) < 0, i< j<q,那么A(i, q)  肯定不是数列A的最大递增子列。

S(i, q) = S(i, j) + S(j+1, q) < 0 + S(j+1, q) = S(j+1, q)
这个结论说明,从位置 i 开始的子列,一旦遇到和为0的子列,后面可以不搜索了,直接从 j+1 开始重新计算。

 (2)、如果A(i, j) 是数列A以 i 起始的子列中第一个和S(i, j) < 0 的,则对任意 i <= p <= j, p<= q,A(p, q) 的和 S(p, q) 要么小于最大连续子列和,要么与现存的最大连续子列和相等。所以A(p, q)序列可以跳过。
 因为S(i ,j) 是第一个<0 的,所以S(i, p-1)必然>=0,则 S(p, q) = S(i, q) - S(i, p-1) <= S(i, q)

- 当 q > j 时,由结论1得知, S(i, q) < S(j+1, q),则 S(p, q) < S(j+1, q)

- 当q <= j 时,(这个暂时不会证明。。。)
//o(n)
void MaxSubSet_2(int nums[], int length)
{
	if (length == 0)
		return;

	int start = 0;
	int sum = nums[0];

	int maxStart = 0;
	int maxEnd = 0;
	int maxSum = nums[0];
	
	for (int i = 1; i < length; i++)
	{
		sum += nums[i];

		if (sum > maxSum)
		{
			maxStart = start;
			maxEnd = i;
			maxSum = sum;
		}

		if (sum < 0)
		{
			start = i + 1;
			sum = 0;
		}
	}

	cout << "Max: " << maxSum << " ( " << maxStart << ", " << maxEnd << " )" << endl;
}

6、有100步楼梯,每次走1步或两步 问有多少走法

上到第n级共有a(n)种方法
那么:a(1)=1,a(2)=2,a(3)= a(2)+1=3,a(4)=a(3)+ a(2) .....

上到第n级有两种情形
①从第n-1级上1步
②从第n-2级上2步(不能上1步,否则与第一种情形重复)

a(n)=a(n-1) + a(n-2)  ...

又是一个 fibonacci数列


### 螺旋矩阵问题的实现方法 螺旋矩阵问题是编程中常见的矩阵操作问题之一,主要目标是按照顺时针方向从外向内遍历矩阵的元素。以下是几种常见的实现方法: #### 1. **标准求解:检测4个方向** 这是一种基础的实现方式,通过模拟顺时针螺旋的遍历顺序,依次向右、向下、向左、向上移动,每次到达矩阵边界或遇到已访问的元素时改变方向。 ```python def spiral_order(matrix): if not matrix: return [] rows, cols = len(matrix), len(matrix[0]) visited = [[False]*cols for _ in range(rows)] result = [] # 定义四个方向:右、下、左、上 directions = [(0,1), (1,0), (0,-1), (-1,0)] row, col = 0, 0 direction_index = 0 for _ in range(rows * cols): result.append(matrix[row][col]) visited[row][col] = True next_row = row + directions[direction_index][0] next_col = col + directions[direction_index][1] # 检查是否需要改变方向 if (next_row < 0 or next_row >= rows or next_col < 0 or next_col >= cols or visited[next_row][next_col]): direction_index = (direction_index + 1) % 4 row += directions[direction_index][0] col += directions[direction_index][1] return result ``` #### 2. **改进版一:检测2个方向** 该方法通过按层遍历的方式,逐层处理矩阵的外圈,直到所有元素都被访问。每一层处理四个边(上、右、下、左)。 ```python def spiral_order(matrix): if not matrix: return [] result = [] rows, cols = len(matrix), len(matrix[0]) top, bottom, left, right = 0, rows - 1, 0, cols - 1 while top <= bottom and left <= right: # 从左到右 for col in range(left, right + 1): result.append(matrix[top][col]) top += 1 # 从上到下 for row in range(top, bottom + 1): result.append(matrix[row][right]) right -= 1 # 从右到左 if top <= bottom: for col in range(right, left - 1, -1): result.append(matrix[bottom][col]) bottom -= 1 # 从下到上 if left <= right: for row in range(bottom, top - 1, -1): result.append(matrix[row][left]) left += 1 return result ``` #### 3. **改进版二:可读性改进** 此方法与第二种方法类似,但通过明确的变量命名和逻辑分离,提高了代码的可读性。 ```python def spiral_order(matrix): result = [] if not matrix: return result rows, cols = len(matrix), len(matrix[0]) top, bottom, left, right = 0, rows - 1, 0, cols - 1 while top <= bottom and left <= right: # 顶部行:从左到右 for col in range(left, right + 1): result.append(matrix[top][col]) top += 1 # 右侧列:从上到下 for row in range(top, bottom + 1): result.append(matrix[row][right]) right -= 1 # 底部行:从右到左 if top <= bottom: for col in range(right, left - 1, -1): result.append(matrix[bottom][col]) bottom -= 1 # 左侧列:从下到上 if left <= right: for row in range(bottom, top - 1, -1): result.append(matrix[row][left]) left += 1 return result ``` ### 托普利茨矩阵的判定 托普利茨矩阵(Toeplitz Matrix)的定义是:矩阵中每一条从左上到右下的对角线上的元素都相同。 ```python from typing import List def is_toeplitz_matrix(matrix: List[List[int]]) -> bool: rows, cols = len(matrix), len(matrix[0]) for i in range(rows - 1): for j in range(cols - 1): if matrix[i][j] != matrix[i + 1][j + 1]: return False return True ``` ### 矩阵加法的实现 矩阵加法要求两个矩阵的行数和列数相等,然后将对应位置的元素相加。 ```python n, m = map(int, input().split()) # 输入行和列 a = [list(map(int, input().split())) for _ in range(n)] # 输入第一个矩阵 b = [list(map(int, input().split())) for _ in range(n)] # 输入第二个矩阵 # 初始化结果矩阵 c = [[0] * m for _ in range(n)] # 执行矩阵加法 for i in range(n): for j in range(m): c[i][j] = a[i][j] + b[i][j] # 输出结果矩阵 for row in c: print(" ".join(map(str, row))) ``` ### 矩阵转置的实现 矩阵转置是将矩阵的行和列交换,可以通过`zip`函数实现。 ```python matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] transposed = [list(row) for row in zip(*matrix)] print(transposed) # 输出:[[1, 4, 7], [2, 5, 8], [3, 6, 9]] ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值