一.算法
算法是一步一步解决某种问题的方法
1.1算法
算法的特性:输入,输出,精确性,确定性,有穷性,正确性,通用性
算法研究的任务:设计解决一个特定问题的算法,以及对一个给定的算法进行分析
算法分析:正确性,终止性,时间分析,空间分析
1.1习题:
此处主要是对思路考察,所以代码我先用python实现一下效果,易懂
1.写一个算法,在a,b,c中找出最小的那个
(1)x=a
(2)若 b<x,x=b.
(3)若 c<x, x=c.
if a < b and a < c:
print("最小值为:", a)
elif b < c:
print("最小值为:", b)
else:
print("最小值为:", c)
2。写一个算法,在三个不同的值a,b,c中找出中间的那个
思路一,将三个数相加,分别减去最大值和最小值
(1)x=a
(2)若b>x,则x=b
(3)若c>x,则 x=c
(4)y=a
(5)若b<y,则y=b
(6)若c<y,则y=c
(7)w=a+b+c,middle=0
(8)middle=w-x-y
def find_middle(a, b, c):
max_num = max(a, b, c)
min_num = min(a, b, c)
return a + b + c - max_num - min_num
# 测试print(find_middle(1, 2, 3))
# print(find_middle(5, 9, 3))
# print(find_middle(8, 6, 7))
思路二,将三个数从小到大排序,放到数组里,取中间值
(1)创建一个长度为3的数组 x[]=[a,b,c]
(2)若x[1]<x[0],swap x[1],x[0]
(3)若 x[2]< x[1],swap x[2],x[1]
(4)若x[2]<x[0],swap x[2],x[0]
(5)middle =x[1]
num1 = int(input("请输入第一个数:"))
num2 = int(input("请输入第二个数:"))
num3 = int(input("请输入第三个数:"))
# 将三个数从小到大排序
arr = [num1, num2, num3]
arr.sort()
# 取中间值
median = arr[1]
print("中间值为:", median)
3.将两个十进制正整数相加的标准方法写成一个算法(我有点问题)
- 从个位开始,依次将两个数对应位的数字相加,得到当前位的和以及进位;
- 将当前位的和 mod 10 作为该位的结果;
- 将当前位的进位加到下一位的计算中;
- 重复1~3步骤,直到两个数的所有位都处理完毕;
- 如果最高位的进位不为0,则将其加到结果的最高位。
num1=int(input("请输入一个整数"))
num2=int(input("请输入另一个整数"))
def add_two_numbers(num1,num2):
result=[]
carry=0
i,j=len(str(num1))-1,len(str(num2))-1
num1_list =list(str(num1))
num1_int_list=[int(x) for x in num1_list]
num2_list =list(str(num2))
num2_int_list=[int(x) for x in num2_list]
while i>=0 or j>=0:
sum = carry
if i >= 0:
sum +=num1_int_list[i]
i -= 1
if j >= 0:
sum += num2_int_list[j]
j -= 1
result.append(str(sum % 10))
carry = sum // 10
if carry != 0:
result.append(str(carry))
return ''.join(result[::-1])
print(add_two_numbers(num1,num2))
1.2表述算法的伪代码
伪代码:应该包括标题,简要说明,输入和输出参数,函数部分(第一行为函数名,里面是函数的参数,参数表示函数用的数据,变量,数组等,被函数执行的语句由大括号括起)
(1)if 语句 条件为真,执行动作,//表示注释
if(condition)
action1 //符合条件执行action1
else
action2
(2) return 语句 //结束一个函数,并把x的值返回给函数调用者
(3)while循环
while(condition)
action
1.2.2伪代码练习
1.用while循环写一个算法,回送数组S[1],s[2],....s[n]的最小值
Input Parameter:s
Output Parameters:None
array_min_verl(s){
small=s[1]
i=2
while(i<=s.last){
if(s[i]<small)//找到最小值
small=s[i]
i+=1
}
return small
}
2.使用for循环写一个算法,回送数组S[1],s[2],....s[n]的最小值
Input Parameter: s
Output Parameter: None
array_min_ver2(s){
small=s[1]
for i =2 to s.last
if (s[i]<small)//找到较小的值
small=s[i]
return small
}
3.写一个算法,输出数组S[1],s[2],...s[n]的最大值与次大值。假定n>1,且数组中各元素的值豆不相同
Input parameter:s
Output parameter:None
array_maxandTheNextLargestValue_vel3(s){
if(s[1]>s[2])
max=s[1]
TheNextLargestValue=S[2]
else
max=s[2]
TheNextLargestValue=S[1]
for i=3 to s.last
if(s[i]>max)
TheNextLargestValue=max
max=s[i]
else(TheNextLargestValue<s[i]<max)
TheNextLargestValue=s[i]
return max,TheNextLargestValue
}
4.写一个算法,输出数组S[1],s[2],...s[n]中最小值与次小值。假定n>1,且数组中各元素的值都不相同
Input parameter:s
Output parameter:None
array_minandTheNextSmallestValue_vel4(s){
if(s[1]<s[2])
min=s[1]
TheNextSmallestValue=S[2]
else
min=s[2]
TheNextSmallestValue=S[1]
for i=3 to s.last
if(s[i]<min)
TheNextSmallestValue=min
min=s[i]
else(TheNextSmallestValue>s[i]>min)
TheNextSmallestValue=s[i]
return min,TheNextSmallestValue
}
5,写一个算法,输出数组S[1],S[2],...S[n]中最小值和最大值
Input parameter:s
Output parameter:None
array_minandmax_vel5(s){
if(s[1]<s[2])
min=s[1]
max=S[2]
else
min=s[2]
max=S[1]
for i=3 to s.last
if(s[i]<min)
min=s[i]
else(s[i]>max)
max=s[i]
return min,max
}
6,写一个算法,回送出数组S[1],S[2],...S[n]中首次出现的最大元素的下标
这个我没看懂题意,先留个坑
首次出现的最大元素,应该就是拿第一个元素去做对比,直到出现一个比第一个元素大的元素,然后记录其下标
Input Parameter :S
Output parameters: None
find_first_largest(s){
index = 1 //记录当前最大元素的下标 index
for i =2 to s.last
if(s[i]>=s[index])
index=i //更新
break
return index
}
7.写一个算法,回送出数组S[1],S[2],...S[n]中末次出现的最大元素的下标
这个好像要用到哈希表,我也没理解题意。先留个坑,以后学到了来补
我多想了
Input Parameter :S
Output parameters: None
find_last_largest(s){
index = 1 #记录当前最大元素的下标 index
for i =2 to s.last
if(s[i]>=s[index])
index=i //更新
return index
}
8.写一个算法,回送数组s[1],s[2]...s[n]中首次出现值key的下标,如果数组中没有这个值,就返回0
Input parameter :s
Output parameter:None
key=anynumber
find_key_value(s){
index=0
for i =1 to s.last
if(s[i]=key)
index=i
break
return index
}
9.写一个算法,回送数组s[1],s[2]...s[n]中末次出现值key的下标,如果数组中没有这个值,就返回0
Input parameter :s
Output parameter:None
key=anynumber
find_key_value(s){
index=0
for i =1 to s.last
if(s[i]=key)
index=i
return index
}
10.写一个算法,回送数组s[1],s[2]...s[n]中首次出现小于前一项的那个项的下标,如果n=1,或者对所有i,s[i]<=s[i+1],则回送值0
Input parameter :s
Output parameter:None
find_out_of_order(s){
index=1
n=len(s)
if n = 1
return index=0
else
for i=2 to s.last{
if (s[i]<s[index])
index=i
else
index=0
return index
}
}
我写的答案太笨拙了
Input parameter :s
Output parameter:None
find_out_of_order(s){
for i=2 to s.last
if (s[i]<s[i-1])
return i
return 0
}
11.写一个算法,将数组s[1],s[2],...,s[n]倒置
12.写一个算法,输入数组s[1],s[2]...s[n]和一个值x(假定所有的值都是实数),设n>1,该数组对所有i满足s[i]<=s[i+1].该算法将x插入数组,使得对所有i任然满足s[i]<=s[i+1]
13.写一个算法,输入一个二进制位的数组s[1],s[2],...,s[n],该算法重新安排该数组,让所有0都在1前面