我需要在列表中找到第一个缺失的数字。如果没有号码丢失,则下一个号码应该是最后一个号码。
应首先检查第一个数字是否为> 1,如果是,则新号码应为1。
这是我尝试过的。问题出在这里:ProcessExists(wchar_t* processName)
{
DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;
if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
{
return false;
}
// Calculate how many process identifiers were returned.
cProcesses = cbNeeded / sizeof(DWORD);
// Print the name and process identifier for each process.
for ( i = 0; i < cProcesses; i++ )
{
if( aProcesses[i] != 0 )
{
PrintProcessNameAndID( aProcesses[i] );
}
}
return false;
}
void PrintProcessNameAndID( DWORD processID )
{
TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
// Get a handle to the process.
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, processID );
// Get the process name.
if (NULL != hProcess )
{
HMODULE hMod;
DWORD cbNeeded;
if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
&cbNeeded) )
{
GetModuleBaseName( hProcess, hMod, szProcessName,
sizeof(szProcessName)/sizeof(TCHAR) );
}
}
// Print the process name and identifier.
dprintf( TEXT("%s (PID: %u) %s %s\n"), szProcessName, processID );
// Release the handle to the process.
CloseHandle( hProcess );
}
导致错误,因为在结尾和开头我有一个if next_value - items > 1:
。
None
另一种方法:
list = [1,2,5]
vlans3=list
for items in vlans3:
if items in vlans3:
index = vlans3.index(items)
previous_value = vlans3[index-1] if index -1 > -1 else None
next_value = vlans3[index+1] if index + 1 < len(vlans3) else None
first = vlans3[0]
last = vlans3[-1]
#print ("index: ", index)
print ("prev item:", previous_value)
print ("-cur item:", items)
print ("nxt item:", next_value)
#print ("_free: ", _free)
#print ("...")
if next_value - items > 1:
_free = previous_value + 1
print ("free: ",_free)
break
print ("**************")
print ("first item:", first)
print ("last item:", last)
print ("**************")
如果数字之间存在间隙,则会产生正确的数字,但如果没有剩余空格,则会出现错误:L = vlans3
free = ([x + 1 for x, y in zip(L[:-1], L[1:]) if y - x > 1][0])
。但是我需要以某种方式指定如果没有可用空间,它应该给出一个新的数字(最后+1)。但是使用下面的代码会出错,我不知道为什么。
IndexError: list index out of range
答案 0 :(得分:1)
获取不属于vlans3
成员的最小整数:
ints_list = range(min(vlans3), max(vlans3) + 1)
missing_list = [x for x in ints_list if x not in vlans3]
first_missing = min(missing_list)
但是,如果列表中的最小值大于1,则返回1;如果没有缺失值,则返回最后一个值+ 1,因此这将变为:
ints_list = [1] + list(range(min(vlan3), max(vlan3) + 2))
missing_list = [x for x in ints_list if x not in vlan3]
first_missing = min(missing_list)
答案 1 :(得分:0)
首先避免使用保留字list
作为变量。
第二次使用尝试:除了快速,整齐地避免这种问题。
def free(l):
if l == []: return 0
if l[0] > 1: return 1
if l[-1] - l[0] + 1 == len(l): return l[-1] + 1
for i in range(len(l)):
try:
if l[i+1] - l[i] > 1: break
except IndexError:
break
return l[i] + 1
答案 2 :(得分:0)
fetch('https://dl.dropboxusercontent.com/s/v2pca6kq8nsqmso/abb5c48dae55560e4ae7d41af7bfdc50.jpg?raw=1', {
method: 'GET',
mode: 'cors',
cache: 'no-cache',
credentials: 'same-origin',
headers: {},
referrer: 'no-referrer',
}).then(x => x.blob().then(y => console.log(y)))
解决方案如何?如果您的输入是一个具有不重复正值(或为空)的排序的整数列表,则下面的代码有效。
nekomatic 的解决方案要快一些,但仅需不到一秒钟,并不重要。但是,它不适用于较大的输入-例如numpy
通过包含检查完全冻结了列表的理解。下面的代码没有这个问题。
list(range(1,100000))
import numpy as np
def first_free_id(array):
array = np.concatenate((np.array([-1, 0], dtype=np.int), np.array(array, dtype=np.int)))
where_sequence_breaks = np.where(np.diff(array) > 1)[0]
return where_sequence_breaks[0] if len(where_sequence_breaks)>0 else array[-1]+1
适用于空列表和1元素列表,而不会破坏现有序列的连续性。