主頁 >  其他 > 順序表的實作以及力扣練習題

順序表的實作以及力扣練習題

2021-10-30 11:33:55 其他

目錄

線性表

順序表

順序表的實作

順序表的初始化

順序表的銷毀

順序表的列印

順序表檢查是否要擴容

順序表的尾插

順序表的頭插

順序表的尾刪

順序表的頭刪

順序表的查找

順序表在pos位置插入x

順序表洗掉pos位置的值

順序表修改pos位置的值

順序表的缺陷

力扣練習題

Leetcode27.移除元素

Leetcode26.洗掉有序陣列中的重復項

Leetcode88.合并兩個有序陣列

Leetcode189.旋轉陣列


線性表

線性表(linear list)是n個具有相同特性的資料元素的有限序列,線性表是一種在實際中廣泛使用的資料結構,常見的線性表:順序表、鏈表、堆疊、佇列、字串等等

線性表在邏輯上是線性結構的,也就說是連續的一條直線,但是在物理結構上并不一定是連續的,線性表在物理上存盤時,通常以陣列和鏈式結構的形式存盤,

順序表

順序表使用一段物理地址連續的存盤單元依次存盤資料元素的線性結構,一般情況下采用資料存盤,在陣列上完成資料的增刪查改,

順序表一般分為:

1.靜態順序表:使用定長陣列存盤元素

2.動態順序表:使用動態開辟的陣列存盤

了解了線性表與順序表之后,下面我們就來實作以下動態順序表吧,

順序表的實作

函式介面的宣告

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLDataType;

//動態順序表
typedef struct Seqlist
{
	SLDataType *a;
	int  sz;//表示陣列中存盤了多少個資料
	int  capacity;//表示陣列實際能存盤的空間容量
}SL;

//初始化
void SeqlistInit(SL* ps);

//順序表的列印
void SeqlistPrint(SL* ps);

//順序表的銷毀
void SeqlistDestory(SL* ps);

//尾插
void SeqlistPushBack(SL*ps, SLDataType x);

//頭插
void SeqlistPushFront(SL*ps, SLDataType x);

//尾刪
void SeqlistPopBack(SL*ps);

//頭刪
void SeqlistPopFront(SL*ps);

//順序表查找
int SeqlistFind(SL*ps, SLDataType x);

//順序表檢查是否要擴容
void SeqlistCheck(SL*ps);

//順序表在pos位置插入x
void SeqlisInsert(SL*ps, int pos, SLDataType x);

//順序表洗掉pos位置的值
void SeqlistErase(SL*ps, int pos);

//順序表修改pos位置的值
void SeqlistModify(SL*ps, int pos, SLDataType x);

函式介面的實作:

#define _CRT_SECURE_NO_WARNINGS 1
#include"Seqlist.h"

//順序表檢查是否要擴容
void SeqlistCheck(SL*ps)
{
	if (ps->sz == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		SLDataType* temp = (SLDataType*)realloc(ps->a, sizeof(SLDataType*)*newcapacity);
		//當一個指標為NULL指標時,realloc就相當于malloc,這里我們還需要判斷一下是否擴容成功
		if (temp == NULL)
		{
			printf("realloc failed\n");
			exit(-1);
		}
		//擴容成功
		else
		{
			ps->a = temp;
			ps->capacity = newcapacity;
		}
	}
}

//初始化的實作
void SeqlistInit(SL* ps)
{
	ps->a = NULL;
	ps->sz = ps->capacity = 0;
}

//順序表的列印
void SeqlistPrint(SL* ps)
{
	int i = 0;
	for (i = 0; i < ps->sz; i++)
	{
		printf("%d ", ps->a[i]);
	}
	printf("\n");
}

//順序表的銷毀
void SeqlistDestory(SL* ps)
{
	free(ps->a);
	ps->a = NULL;
	ps->a = 0;
	ps->capacity = 0;
}

//尾插的實作
void SeqlistPushBack(SL*ps, SLDataType x)
{
	assert(ps);
	//如果空間不夠或者空間為0時,就得擴容
	SeqlistCheck(ps);
	//if (ps->sz == ps->capacity)
	//{
	//	int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
	//	SLDataType* temp = (SLDataType*)realloc(ps->a, sizeof(SLDataType*)*newcapacity);
	//	//當一個指標為NULL指標時,realloc就相當于malloc,這里我們還需要判斷一下是否擴容成功
	//	if (temp == NULL)
	//	{
	//		printf("realloc failed\n");
	//		exit(-1);
	//	}
	//	//擴容成功
	//	else
	//	{
	//		ps->a = temp;
	//		ps->capacity = newcapacity;
	//	}
	//}
	//假如空間足夠,那么我們直接往后插入
	ps->a[ps->sz] = x;
	ps->sz++;//順序表有效元素個數+1
}

//頭插的實作
void SeqlistPushFront(SL*ps, SLDataType x)
{
	assert(ps);
	//當空間不夠的時候就擴容
	SeqlistCheck(ps);
	//if (ps->sz == ps->capacity)
	//{
	//	int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
	//	SLDataType* temp = (SLDataType*)realloc(ps->a, sizeof(SLDataType*)*newcapacity);
	//	//當一個指標為NULL指標時,realloc就相當于malloc,這里我們還需要判斷一下是否擴容成功
	//	if (temp == NULL)
	//	{
	//		printf("realloc failed\n");
	//		exit(-1);
	//	}
	//	//擴容成功
	//	else
	//	{
	//		ps->a = temp;
	//		ps->capacity = newcapacity;
	//	}
	//}
	//當空間足夠的時候,頭插的話得向后挪并且是從后往前挪,從前往后會造成覆寫達不到效果
	int end = ps->sz-1;
	while (end>=0)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[0] = x;
	ps->sz++;//順序表有效元素個數+1

}

//尾刪的實作
void SeqlistPopBack(SL*ps)
{
	assert(ps);
    assert(ps->sz > 0);
	ps->sz--;//順序表有效元素個數-1
}

//頭刪的實作
void SeqlistPopFront(SL*ps)
{
	assert(ps);
    assert(ps->sz > 0);
	int begin = 1;
	while (begin <ps->sz)
	{
		//從前往后覆寫
		ps->a[begin-1] = ps->a[begin];
		begin++;
	}
	ps->sz--;//順序表有效元素個數-1
}

//順序表查找
int SeqlistFind(SL*ps, SLDataType x)
{
	assert(ps);
	int i = 0;
	for (i = 0; i < ps->sz; i++)
	{
		if (ps->a[i] == x)
		{
			//找到了
			return i;
		}
	}
	//找不到
	return -1;
}

//順序表在pos位置插入x
void SeqlisInsert(SL*ps, int pos, SLDataType x)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->sz);
	//當空間不夠的時候就擴容
	SeqlistCheck(ps);
	//相當于頭插
		int end = ps->sz - 1;
		while (end >= pos)
		{
			ps->a[end + 1] = ps->a[end];
			end--;
		}
		ps->a[pos] = x;
		ps->sz++;//順序表有效元素個數+1
}

//順序表洗掉pos位置的值
void SeqlistErase(SL*ps, int pos)
{
	assert(ps);
	assert(pos >= 0 && pos < ps->sz);
	int begin = pos;
	while (begin < ps->sz)
	{
		//從前往后覆寫
		ps->a[begin-1] = ps->a[begin];
		begin++;
	}
	ps->sz--;
}

//順序表修改pos位置的值
void SeqlistModify(SL*ps, int pos, SLDataType x)
{
	assert(ps);
	assert(pos >= 0 && pos < ps->sz);
	ps->a[pos] = x;
}

順序表的初始化

將結構體中指向動態開辟的陣列的指標置空,將size與capacity置為0.

//初始化的實作
void SeqlistInit(SL* ps)
{
	ps->a = NULL;
	ps->sz = ps->capacity = 0;
}

順序表的銷毀

釋放在堆上動態開辟的空間,并且將size與capacity置成0

//順序表的銷毀
void SeqlistDestory(SL* ps)
{
	free(ps->a);
	ps->a = NULL;
	ps->a = 0;
	ps->capacity = 0;
}

順序表的列印

依次列印動態開辟的陣列中的有效資料

//順序表的列印
void SeqlistPrint(SL* ps)
{
	int i = 0;
	for (i = 0; i < ps->sz; i++)
	{
		printf("%d ", ps->a[i]);
	}
	printf("\n");
}

順序表檢查是否要擴容

當size與capacity相等并且都為0時,就將capacity的容量變成4,若是size與capacity相等但是不為0時,我們就需要擴容了將capacity的容量擴成2倍,

//順序表檢查是否要擴容
void SeqlistCheck(SL*ps)
{
	if (ps->sz == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		SLDataType* temp = (SLDataType*)realloc(ps->a, sizeof(SLDataType*)*newcapacity);
		//當一個指標為NULL指標時,realloc就相當于malloc,這里我們還需要判斷一下是否擴容成功
		if (temp == NULL)
		{
			printf("realloc failed\n");
			exit(-1);
		}
		//擴容成功
		else
		{
			ps->a = temp;
			ps->capacity = newcapacity;
		}
	}
}

順序表的尾插

首先要判斷一下空間容量是否充足,若空間滿了就應該當先擴容再尾插,若空間充足即可直接尾插,

//尾插的實作
void SeqlistPushBack(SL*ps, SLDataType x)
{
	assert(ps);
	//如果空間不夠或者空間為0時,就得擴容
	SeqlistCheck(ps);
	//if (ps->sz == ps->capacity)
	//{
	//	int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
	//	SLDataType* temp = (SLDataType*)realloc(ps->a, sizeof(SLDataType*)*newcapacity);
	//	//當一個指標為NULL指標時,realloc就相當于malloc,這里我們還需要判斷一下是否擴容成功
	//	if (temp == NULL)
	//	{
	//		printf("realloc failed\n");
	//		exit(-1);
	//	}
	//	//擴容成功
	//	else
	//	{
	//		ps->a = temp;
	//		ps->capacity = newcapacity;
	//	}
	//}
	//假如空間足夠,那么我們直接往后插入
	ps->a[ps->sz] = x;
	ps->sz++;//順序表有效元素個數+1
}

順序表的頭插

首先要判斷一下空間容量是否充足,若空間滿了應當先擴容,若空間足夠想要頭插的話得將有效資料先往后挪并且是從后往前挪,從前往后會造成覆寫達不到想要的效果,挪動之后再插入資料,

//頭插的實作
void SeqlistPushFront(SL*ps, SLDataType x)
{
	assert(ps);
	//當空間不夠的時候就擴容
	SeqlistCheck(ps);
	//if (ps->sz == ps->capacity)
	//{
	//	int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
	//	SLDataType* temp = (SLDataType*)realloc(ps->a, sizeof(SLDataType*)*newcapacity);
	//	//當一個指標為NULL指標時,realloc就相當于malloc,這里我們還需要判斷一下是否擴容成功
	//	if (temp == NULL)
	//	{
	//		printf("realloc failed\n");
	//		exit(-1);
	//	}
	//	//擴容成功
	//	else
	//	{
	//		ps->a = temp;
	//		ps->capacity = newcapacity;
	//	}
	//}
	//當空間足夠的時候,頭插的話得向后挪并且是從后往前挪,從前往后會造成覆寫達不到效果
	int end = ps->sz-1;
	while (end>=0)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[0] = x;
	ps->sz++;//順序表有效元素個數+1

}

順序表的尾刪

首先對有效資料sz進行判斷,如果有效資料為0就不需要洗掉,大于0就只需要將ps->sz--就可以了,

//尾刪的實作
void SeqlistPopBack(SL*ps)
{
	assert(ps);
	assert(ps->sz > 0);
	ps->sz--;//順序表有效元素個數-1
}

順序表的頭刪

首先對有效資料sz進行判斷,如果有效資料為0就不需要洗掉,如果有效資料大于0的話,需要將有效資料向前挪動,并且是進行從前往后的覆寫,然后再將ps->sz--就可以達到效果了

//頭刪的實作
void SeqlistPopFront(SL*ps)
{
	assert(ps);
	assert(ps->sz > 0);
	int begin = 1;
	while (begin <ps->sz)
	{
		//從前往后覆寫
		ps->a[begin-1] = ps->a[begin];
		begin++;
	}
	ps->sz--;//順序表有效元素個數-1
}

順序表的查找

在有效資料中進行查找,找到了就回傳該位置的下標,找不到則回傳-1;

//順序表查找
int SeqlistFind(SL*ps, SLDataType x)
{
	assert(ps);
	int i = 0;
	for (i = 0; i < ps->sz; i++)
	{
		if (ps->a[i] == x)
		{
			//找到了
			return i;
		}
	}
	//找不到
	return -1;
}

順序表在pos位置插入x

要想插入資料,首先就得檢查空間容量是否足夠,空間不足的話首先的擴容,空間足夠的話需要將pos位置與pos后面的資料向后挪動,并且是從后往前挪,再將x插入到pos的位置上,(需要注意的是pos的位置必須>=0并且不能超過ps->sz-1),最后對ps->sz++即可

//順序表在pos位置插入x
void SeqlisInsert(SL*ps, int pos, SLDataType x)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->sz);
	//當空間不夠的時候就擴容
	SeqlistCheck(ps);
	//相當于頭插
		int end = ps->sz - 1;
		while (end >= pos)
		{
			ps->a[end + 1] = ps->a[end];
			end--;
		}
		ps->a[pos] = x;
		ps->sz++;//順序表有效元素個數+1
}

順序表洗掉pos位置的值

洗掉pos位置的值,需要將pos位置之后的元素從前往后挪動,覆寫pos位置的資料,最后再將ps->sz--即可

//順序表洗掉pos位置的值
void SeqlistErase(SL*ps, int pos)
{
	assert(ps);
	assert(pos >= 0 && pos < ps->sz);
	int begin = pos;
	while (begin < ps->sz)
	{
		//從前往后覆寫
		ps->a[begin-1] = ps->a[begin];
		begin++;
	}
	ps->sz--;
}

順序表修改pos位置的值

直接修改pos位置的值即可

//順序表修改pos位置的值
void SeqlistModify(SL*ps, int pos, SLDataType x)
{
	assert(ps);
	assert(pos >= 0 && pos < ps->sz);
	ps->a[pos] = x;
}

順序表的缺陷

1.空間不夠了需要擴容,增容是需要付出代價的

2.避免頻繁擴容(頻繁擴容會導致記憶體碎片變多),空間滿了我們一般都是擴2倍,這樣做可能會導致一定的空間浪費

3.順序表要求資料從開始位置連續存盤,那么我們在頭部或者中間位置插入洗掉資料就需要挪動資料,效率不高

力扣練習題

Leetcode27.移除元素

27. 移除元素題目鏈接:27. 移除元素

題目描述:

給你一個陣列 nums 和一個值 val,你需要 原地 移除所有數值等于 val 的元素,并回傳移除后陣列的新長度,

不要使用額外的陣列空間,你必須僅使用 O(1) 額外空間并 原地 修改輸入陣列,

元素的順序可以改變,你不需要考慮陣列中超出新長度后面的元素,

思路一:遍歷陣列找到等于val的值,通過挪動資料來覆寫val達到移除所有等于val的元素的效果,時間復雜度是O(N^2),空間復雜度O(1)

思路二:開一個與原陣列空間一樣大的陣列,然后再遍歷原陣列,不等于val的值就放到新陣列里面去,然后再將新陣列的值拷回到原陣列,時間復雜度是O(N),空間復雜度O(N),這是一種拿空間換時間的做法,

思路三:雙指標的做法,定義一個src與dest,并且讓它倆都從陣列0下標開始,如果src下標的值等于val,直接讓src++,dest不動,如果src下標的值不等于val,那么就把src下標的值賦給dest下標的值,并且讓src++,dest++,最后回傳的dest正好就是陣列新的長度,時間復雜度O(N),空間復雜度O(1)

int removeElement(int* nums, int numsSize, int val){
int src = 0;
 int dest = 0;
 //遍歷完這個陣列就結束
 while(src<numsSize)
 {
     //當src下標元素等于val時,src++
    if(nums[src]==val)
    {
        src++;
    }
    //否則的話將src下標元素的值賦給dest下標元素的值,然后src++,dest++
    else
    {
       nums[dest] = nums[src];
       dest++;
       src++;
    }
 }
 return dest;
}

Leetcode26.洗掉有序陣列中的重復項

題目鏈接:26. 洗掉有序陣列中的重復項

題目描述:

給你一個有序陣列 nums ,請你 原地 洗掉重復出現的元素,使每個元素 只出現一次 ,回傳洗掉后陣列的新長度,

不要使用額外的陣列空間,你必須在 原地 修改輸入陣列 并在使用 O(1) 額外空間的條件下完成,

思路:這道題我們還是采用雙指標的解法,不過是快慢指標,定義兩個變數,一個是快指標src=1,一個是慢指標dest=0,先考慮特殊情況(如果陣列大小為0,直接回傳0即可) 然后再來看一般情況,通過src去遍歷陣列,如果src下標元素的值與dest下標元素的值相等,那么讓src++,dest不動,如果不相等,就先讓dest++再將src下標元素的值賦給dest下標元素的值,再讓src++即可,時間復雜度O(N),空間復雜度O(1).

int removeDuplicates(int* nums, int numsSize){
int src = 1;//快指標
int dest = 0;//慢指標
//特殊情況陣列大小為0
if(numsSize==0)
{
    return 0;
}
//遍歷陣列
while(src<numsSize)
{
    //如果快指標和慢指標所指向的元素是一樣的,那么慢指標不動,快指標向后移
    if(nums[src]==nums[dest])
    {
        src++;
    }
    //如果快指標和慢指標所指向的元素不一樣的,那么慢指標先向后移,將快指標指向元素的值賦給慢指標,快指標再往后移
    else 
    {
        dest++;
        nums[dest] = nums[src];
        src++;
    }
}
 return dest+1;
}

Leetcode88.合并兩個有序陣列

題目鏈接:88. 合并兩個有序陣列

題目描述:

給你兩個按 非遞減順序 排列的整數陣列 nums1 和 nums2,另有兩個整數 m 和 n ,分別表示 nums1 和 nums2 中的元素數目,

請你 合并 nums2 到 nums1 中,使合并后的陣列同樣按 非遞減順序 排列,

注意:最終,合并后陣列不應由函式回傳,而是存盤在陣列 nums1 中,為了應對這種情況,nums1 的初始長度為 m + n,其中前 m 個元素表示應合并的元素,后 n 個元素為 0 ,應忽略,nums2 的長度為 n ,

思路:這道題我們需要采用歸并的思想,并且是從后往前歸并(從大到小),從前往后的話會造成覆寫達不到我們想要的效果,由于nums1的長度是nums1與nums2有效資料長度之和,因此從nums1與nums2中挑選出較大的數依次插入到nums1陣列的后面(從后往前),如果nums2先插入完了,那么我們直接回傳nums1就可以了,但是如果是nums1的有效資料先插入完,但是nums2的優先資料還沒插入完的話,我們還需要額外將nums2剩余的資料插入到nums1中,時間復雜度O(N),空間復雜度O(1).

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int end1 = m-1;
int end2 = n-1;
int end = n+m-1;//num1最后一個元素的下標

while(end1>=0&&end2>=0)
{
    if(nums1[end1]>nums2[end2])
    {
        nums1[end] = nums1[end1];
        end--;
        end1--;
    }
    else
    {
        nums1[end] = nums2[end2];
        end--;
        end2--;
    }
}
 //nums1的有效數已經全放到了nums1后面的位置,nums2還沒有完全放進去
    while(end2>=0)
    {
         nums1[end] = nums2[end2];
        end--;
        end2--;
    }
return nums1;
}

Leetcode189.旋轉陣列

題目鏈接:189. 旋轉陣列

題目描述:

給定一個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數,

思路:先將n-k個數進行逆置,再將后k個數進行逆置,最后再整體逆置,這樣就達到我們想要的效果了,時間復雜度O(N),空間復雜度O(1).

void Reverse(int*nums,int left,int right)
{
   while(left<right) 
   {
    int temp = nums[left];
    nums[left] = nums[right];
    nums[right] = temp;
    left++;
    right--; 
   }
}

void rotate(int* nums, int numsSize, int k){
    if(k>=numsSize)
    {
        k%=numsSize;
    }

//前n-k個數逆置
Reverse(nums,0,numsSize-k-1);
//后k個數逆置
Reverse(nums,numsSize-k,numsSize-1);
//整體逆置
Reverse(nums,0,numsSize-1);
}

以上就是本篇文章的全部內容了,大家學資料結構的時候不能夠光看視頻,一定要下去多敲代碼做題目鞏固自己所學的知識,如果覺得博主的文章對你有幫助的話,可以點贊評論收藏支持一下博主,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/342040.html

標籤:其他

上一篇:【演算法千題案例】每日LeetCode打卡——66.反轉字串

下一篇:快速理解工廠方法模式,及其在原始碼中的應用

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more