python数据结构算法面试_【算法】数据结构面试算法题目

1 数组去重

python实现

#调用内置函数去重

def func(str):

len1=len(str)

len2=len(list(set(str)))

print("去重后的结果是:",list(set(str)),"\t去重个数是:",(len1-len2))

#for 循环去重

def func1(str):

nums=[]

for n in str:

if n not in nums:

nums.append(n)

print("去重后的结果是:",sorted(nums),"\t去重个数是:",(len(str)-len(nums)))

# while去重

def func2(str):

len1=len(str)

for n in str:

while str.count(n)>1:

del str[str.index(n)]

print("去重后的结果是:",sorted(str),"\t去重个数是:",(len1-len(str)))

str=[1,3,2,4,2,4,1,6,4,5]

func2(str)

字典去重

#调用内置函数去重

def func(str):

len1=len(str.values())

len2=len(list(set(str.values())))

print("去重后的结果是:",list(set(str.values())),"\t去重个数是:",(len1-len2))

#for 循环去重

def func1(str):

nums=[]

for n in str.values():

if n not in nums:

nums.append(n)

print("去重后的结果是:",sorted(nums),"\t去重个数是:",(len(str.values())-len(nums)))

str=[1,3,2,4,2,4,1,6,4,5]

dirc={1:1,2:2,3:3,4:3}

func2(dirc)

python字符串追加去重排序

#调用内置函数去重

def func(str1,str2):

print("去重后的结果是:",sorted(set(str1+str2)),"\t去重个数是:",(len(str1+str2)-len(set(str1+str2))))

#for 循环去重

def func1(str1,str2):

nums=[]

str=str1+str2

for n in str:

if n not in nums:

nums.append(n)

print("去重后的结果是:",sorted(nums),"\t去重个数是:",(len(str)-len(nums)))

# while去重

def func2(str1,str2):

str=str1+str2

for n in str:

while str.count(n)>1:

del str[str.index(n)]

print("去重后的结果是:",sorted(str),"\t去重个数是:",(len(str1+str2)-len(str)))

str1=['很好','不错','很好','Very','Book','I','Love','I']

str2=['Java','C#','Python','C#']

func2(str1,str2)

Java实现

import java.util.LinkedList;

import java.util.List;

public class func {

public static void unique(String[] str){

// array_unique

List list = new LinkedList();

for(int i = 0; i < str.length; i++) {

if(!list.contains(str[i])) {

list.add(String.valueOf(str[i]));

}

}

System.out.print("去重后的结果:"+list+"\t 共去重个数:"+(str.length-list.size()));

}

public static void main(String[] args){

String[] str={"1","3","2","4","2","4","1","6","4","5"};

unique(str);

}

}

set实现

import java.util.HashSet;

import java.util.Set;

public class func {

public static void unique(String[] str){

Set set = new HashSet();

for (int i=0; i

set.add(str[i]);

}

System.out.print("去重后的结果:"+set+"\t 共去重个数:"+(str.length-set.size()));

}

public static void main(String[] args){

String[] str={"Python","SQL","C#","Java","C","Python","R","Matlab","C++","SQL"};

unique(str);

}

}

java字符串追加去重实现

/* package whatever; // don't place package name! */

import java.util.*;

import java.util.Set;

import java.util.HashSet;

import java.lang.*;

import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */

class Ideone

{

/**

* 两个数组合并去重

* 2016年11月5日12:43:34

* 白宁超

* str1 long[] 数组1

* str2 long[] 数组2

*/

public static void disstr(long[] str1,long[] str2 ){

if(str1.length<=0||str2.length<=0){

return;

}

long[] str= new long[str1.length+str2.length];

System.arraycopy(str1, 0, str, 0, str1.length);

System.arraycopy(str2, 0, str, str1.length, str2.length);

Set set=new HashSet();

for(int i=0;i

set.add(str[i]);

}

System.out.print("追加去重后的数据是:\t"+set+"\n\t\t去重个数:\t"+(str.length-set.size()));

}

public static void main (String[] args) throws java.lang.Exception

{

long[] str1={10,20,30,50,10,60,40,20};

long[] str2={50,60,90,80,70};

disstr(str1,str2);

}

}

2  求数组中逆序对的总数,如输入数组1,2,3,4,5,6,7,0  逆序对7

Python实现

# 求数组中逆序对的总数,如输入数组1,2,3,4,5,6,7,0 逆序对7

def index(str3):

res=0

if(len(str3)<0):return 0

if(len(str3)==0):return str3[-1]

else:

for i in str3:

if(str3[i]>str3[-1]):

res+=1

print(res)

str3=[1,2,3,4,5,6,7,0]

#func2(str1,str2)

index(str3)

Java实现

/* package whatever; // don't place package name! */

import java.util.*;

import java.lang.*;

import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */

class Ideone

{

public static void func2(){

int res=0;

int[] str={1,2,3,4,5,6,7,0};

for(int i=0;i

for(int j=i;j

if(str[i]>str[j]){

res++;

}

}

}

System.out.print(res);

}

public static void main (String[] args) throws java.lang.Exception

{

func2();

}

}

3 无序数组A,找到第K个最大值,复杂度小于O(NlgN)

Python实现

方法一:时间复杂度set()*sorted()的复杂度

# 无序数组A,找到第K个最大值,复杂度小于O(NlgN)

def Maxnum(str,n):

if n>len(str) or n<0:

print("输入不合法")

return 0

numArr=sorted(set(str))

m=-n

print(numArr[m])

str3=[1,2,3,4,5,6,7,0]

Maxnum(str3,30)

方法二:时间复杂度O(n)+sorted()复杂度

def Maxnum1(str,n):

newstr=[]

if n>len(str) or n<=0:

print("输入不合法")

return 0

else:

for i in str:

if i not in newstr:

newstr.append(i)

print(sorted(newstr)[-n])

str3=[1,2,3,4,5,6,7,0]

Maxnum1(str3,1)

方法三:时间复杂度O(nlogn)

def bnc_quick(arr,low,high):

if low < high:

key=arr[low]

left=low

right=high

while low < high:

while low < high and arr[high] >= key:

high -= 1

arr[low]=arr[high]

while low < high and arr[low] <= key:

low += 1

arr[high]=arr[low]

arr[low]=key

bnc_quick(arr,left,low-1)

bnc_quick(arr,low+1,right)

arr=[20,10,30,40,100,60,90,210]

print(arr)

bnc_quick(arr,0,len(arr)-1)

n=3

print(arr[-n])

方法四:时间复杂度O(n)

from random import randint

def findKthMax(l,k):

if k>len(l):

return

key=randint(0,len(l)-1)

keyv=l[key]

sl=[i for i in l[:key]+l[key+1:] if i

bl=[i for i in l[:key]+l[key+1:] if i>=keyv]

if len(bl)==k-1:

return keyv

elif len(bl)>=k:

return findKthMax(bl,k)

else:

return findKthMax(sl,k-len(bl)-1)

方法五:时间复杂度O(n)

def base_quick(arr,low,high):

if low < high:

key=arr[low]

left=low

right=high

while low < high:

while low < high and arr[high] >= key:

high -= 1

arr[low]=arr[high]

while low < high and arr[low] <= key:

low += 1

arr[high]=arr[low]

arr[low]=key

return low

def findmax(arr,k):

length = len(arr)

low = 0

high = length - 1

midkey = base_quick(arr, low, high)

while midkey != k:

if midkey > k:

midkey = base_quick(arr, low, midkey - 1)

elif midkey < k:

midkey = base_quick(arr, midkey + 1, high)

return arr[-k:]

Java实现

方法一:时间复杂度O(NlgN)

/* package whatever; // don't place package name! */

import java.util.*;

import java.lang.*;

import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */

class Ideone

{

public static void quickSort(int[] arr,int low,int hight){

if(low < hight){

int key=arr[low];

int left=low;

int right=hight;

while(low < hight){

while(low < hight&&arr[hight] >= key){

hight--;

}

arr[low]=arr[hight];

while(low

low++;

}

arr[hight]=arr[low];

}

arr[low]=key;

quickSort(arr,left,low-1);

quickSort(arr,low+1,right);

}

}

public static void main (String[] args) throws java.lang.Exception

{

// your code goes here

int[] arr={1,3,4,6,7,99,45,26};

for(int i:arr){

System.out.print(i+" ");

}

System.out.println("\n**************************************");

quickSort(arr,0,arr.length-1);

for(int i:arr){

System.out.print(i+" ");

}

System.out.println("\n**************************************");

int k=3;

for(int i=0;i

if(i==arr.length-k){

System.out.print("\n第"+k+"个最大数是:"+arr[arr.length-k]);

}

System.out.println("\n***************}***********************");

int n=3;

System.out.print("前"+n+"个最大数是:\n");

for(int i=arr.length-1;i>=arr.length-n;i--){

System.out.print(arr[i]+" ");

}

}

}

4 排序算法

Python实现冒泡排序

def buttle(arr):

length = len(arr)

for i in range(0,length):

for j in range(i+1,length):

if(arr[i]>arr[j]):

arr[i],arr[j]=arr[j],arr[i]

print(arr)

str3=[1,2,13,4,15,6,7,0]

buttle(str3)

Java实现冒泡排序

public static void buttle(int[] arr){

int temp=0;

for(int i=0;i

for(int j=i+1;j

if(arr[i]>arr[j]){

temp=arr[j];

arr[j]=arr[i];

arr[i]=temp;

}

}

}

for(int n:arr){

System.out.print(n+" ");

}

}

Python实现快排:

def bnc_quick(arr,low,high):

if low < high:

key=arr[low]

left=low

right=high

while low < high:

while low < high and arr[high] >= key:

high -= 1

arr[low]=arr[high]

while low < high and arr[low] <= key:

low += 1

arr[high]=arr[low]

arr[low]=key

bnc_quick(arr,left,low-1)

bnc_quick(arr,low+1,right)

arr=[20,10,30,40,100,60,90,210]

print(arr)

bnc_quick(arr,0,len(arr)-1)

print(arr)

Java实现快排:

/* package whatever; // don't place package name! */

import java.util.*;

import java.lang.*;

import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */

class Ideone

{

public static void quickSort(int[] arr,int low,int hight){

if(low < hight){

int key=arr[low];

int left=low;

int right=hight;

while(low < hight){

while(low < hight&&arr[hight] >= key){

hight--;

}

arr[low]=arr[hight];

while(low

low++;

}

arr[hight]=arr[low];

}

arr[low]=key;

quickSort(arr,left,low-1);

quickSort(arr,low+1,right);

}

}

public static void main (String[] args) throws java.lang.Exception

{

// your code goes here

int[] arr={1,3,4,6,7,99,45,26};

for(int i:arr){

System.out.print(i+" ");

}

System.out.println("\n**************************************");

quickSort(arr,0,arr.length-1);

for(int i:arr){

System.out.print(i+" ");

}

}

}

简单选择排序:

def select(arr):

for i in range(0,len(arr)):

min=i

for j in range(i+1,len(arr)):

if arr[min] > arr[j]:

min=j

arr[min],arr[i]=arr[i],arr[min]

return arr

5 不借助中间变量的两数字交换:

方法一:

private static void swapBySelf(int a, int b) {

// 在不引入其它变量的情况下交换两个数,利用两数之和来做

a = a+b; //a保存两数之和

b = a-b; //两数之和-b,即为a

a = a-b; //两数之和-b,此时的b已经变成了a,所以相当于sum-a=b

}

方法二:

//还有另一种方法,利用两数之差,即两数之间的距离

a = b-a; //a=两者的差

b = b-a; //b = 原来的b-两数的距离==原来的a

a = a+b; //最终的a=两者之差+原来的a==原来的b

System.out.println("swapBySelf second function:a="+a+",b="+b);//又换回来了

方法三:

//已知x^k^k==x,即一个数与任意一个数作两次异或运算都会变成原来的自己

private static void swapByXOR(int a, int b) {

// 在不引入其它变量的情况下交换两个数,利用异或来做

a = a^b; //a保存两数异或的中间结果

b = a^b; //a两次异或b就变成原来的a,并将其赋值给了b

a = a^b; //b两次异或a就变成原来的b,并且将其赋值给了a

System.out.println("swapByXOR first function:a="+a+",b="+b);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python算法面试题比较多,常见的考点有数据结构、动态规划、贪心算法、递归与分治、字符串处理与正则表达式等等。以下以具体题目进行分析: 1. “用Python实现斐波那契数列”: 斐波那契数列是一个经典的算法问题,可以用递归或者循环的方式实现。Python代码如下: 递归实现: ``` def fibonacci(n): if n < 2: return n else: return fibonacci(n-1) + fibonacci(n-2) ``` 循环实现: ``` def fibonacci(n): if n < 2: return n prev, curr = 0, 1 for i in range(n-1): prev, curr = curr, prev+curr return curr ``` 2. “给定一个字符串,找出其中最长的回文子串”: 这是一个比较有难度的问题,可以用动态规划或者中心扩展法实现。Python代码如下: 动态规划实现: ``` def longest_palindrome(s): if not s: return "" n = len(s) dp = [[False]*n for _ in range(n)] start, max_len = 0, 1 for i in range(n): dp[i][i] = True for j in range(i): if s[i] == s[j] and (i-j <= 2 or dp[j+1][i-1]): dp[j][i] = True if i-j+1 > max_len: max_len = i-j+1 start = j return s[start:start+max_len] ``` 中心扩展法实现: ``` def longest_palindrome(s): if not s: return "" n = len(s) start, max_len = 0, 1 for i in range(n): l, r = i, i while r < n-1 and s[r] == s[r+1]: r += 1 while l > 0 and r < n-1 and s[l-1] == s[r+1]: l -= 1 r += 1 if r-l+1 > max_len: max_len = r-l+1 start = l return s[start:start+max_len] ``` 3. “给定一个无序数组,找出其中第k大的元素”: 这是一个比较常见的问题,可以使用快速选择算法实现。Python代码如下: 快速选择实现: ``` import random def quick_select(nums, k): n = len(nums) pivot = random.choice(nums) lt = [x for x in nums if x < pivot] eq = [x for x in nums if x == pivot] gt = [x for x in nums if x > pivot] if k <= len(gt): return quick_select(gt, k) elif k <= len(gt) + len(eq): return pivot else: return quick_select(lt, k-len(gt)-len(eq)) ``` 以上是Python算法面试题的部分实现,不同题目可能涉及的知识点不同,需要根据具体情况进行思考和实现。需要注意的是,除了代码的正确性,时间复杂度和空间复杂度也是考察算法能力的重要指标。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值